- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我创建了一个 ASP.NET MVC 5 应用程序,其以下模型类在其 Email 属性上使用了globalized Required validation 属性:
public class Person
{
[Required(ErrorMessageResourceType = typeof(Resources),
ErrorMessageResourceName = "EmptyEmailError")]
public string Email { get; set; }
}
PersonController 类的 Create POST Action 方法是:
[HttpPost]
public ActionResult Create(FormCollection formData)
{
Person newPerson = new Person();
UpdateModel(newPerson, formData);
if (ModelState.IsValid) {
// code to create the new person
return View("Index", newPerson);
}
else {
return View();
}
}
验证未创建电子邮件地址为空的人的测试用例是:
[TestMethod]
void Create_DoesNotCreatePerson_WhenEmailIsEmpty()
{
// arrange
FormCollection person = new FormCollection() { { "Email", string.Empty } };
PersonController controller = new PersonController();
controller.ControllerContext = new ControllerContext();
// act
controller.Create(person);
// assert
Assert.IsFalse(controller.ModelState.IsValid);
}
使用此代码,正常执行工作正常。但是,测试没有通过,这意味着 UpdateModel
返回 true
,因此没有正确验证人员模型。 TryUpdateModel
方法也不起作用。
但是,如果我从 Person 类的 Required 验证属性中删除 ErrorMessage 参数(即将其保留为 [Required]),则测试通过。
所以我不知道为什么 UpdateModel
在我从测试用例调用 Create 操作方法时不验证全局化的 Person 模型。
最佳答案
我很高兴看到您正在为您的代码编写单元测试:)
首先,你为什么不首先传递 Person
,你真的需要 FormCollection
吗?
[TestMethod]
void Create_DoesNotCreatePerson_WhenEmailIsEmpty()
{
// arrange
FormCollection person = new FormCollection() { { "Email", string.Empty } };
PersonController controller = new PersonController();
controller.ControllerContext = new ControllerContext();
// third, you might need to add this (haven't tested this)
controller.ModelState.AddModelError("Email", "fakeError");
// act
controller.Create(person);
// assert
Assert.IsFalse(controller.ModelState.IsValid);
}
第四个也是最重要的。我不认为你应该这样测试。您想要测试不同场景的结果。这意味着您要测试该方法的返回值。当您说 Assert.IsFalse(controller.ModelState.IsValid);
时,您基本上是在说您不信任 Microsoft 的代码并且您想测试他们的代码。我可以向你保证,他们对他们的代码进行了单元测试,你不需要再次测试它;)
相反,测试返回什么 View 以及从操作结果返回什么对象。这是一篇关于如何对此进行单元测试的完整文章 -> https://msdn.microsoft.com/en-us/library/gg416511(VS.98).aspx (请参阅“创建用于检索联系人的测试”)。希望这对您有所帮助!
编辑(回复评论):
抱歉,响应时间过长。
我移到了“第二”。
如果你想测试真正的生产代码,你想做集成测试,而不是单元测试。如果单元测试是你想要的,我建议你遵循我的解决方案建议,否则创建集成测试。我不知道如何说服你更多,所以我已经尝试过,所以我从几个来源阅读更多,我想你稍后会同意如何在这种情况下进行单元测试:)
祝你好运!
关于c# - 为什么 Controller.UpdateModel 不使用单元测试中的全局化验证属性验证模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30522278/
通俗地说,UpdateModel()和TryUpdateModel()是做什么的?我似乎无法(在 SO 或网络上)找到任何关于它实际做什么的明确解释(用明确的术语),只是人们在使用它时遇到问题。 Vi
对于使用 EF4 在 ASP.NET MVC 3 中保存对我的编辑模型对象的更改的正确方法,我有点困惑,尤其是当我想在保存之前进行一些服务器端清理时。我的操作方法是: [HttpPost] publi
我有一个名为 S2kBool 的自定义对象,它可以与常规 bool 对象相互转换。基本上,它允许我的应用程序像对待 C# bool 值一样对待旧数据库中的 bool 值。那么问题是,当我尝试使用复选框
作为引用,这是在 C# MVC2 网站中。 我想在我的数据库中使用模型保存数据,但我需要使用自定义数据而不是我习惯的 FormCollection 来保存数据。以下是我通常的做法: TryUpdate
我创建了一个 ASP.NET MVC 5 应用程序,其以下模型类在其 Email 属性上使用了globalized Required validation 属性: public class Perso
我一直在努力阅读 Scott Guthrie 在 ASP.NET MVC Beta 1 上的精彩帖子。 .在其中,他展示了对 UpdateModel 方法的改进以及它们如何改进单元测试。我重新创建了一
我有一些关于 asp.net mvc 开发的简单问题。 UpdateModel 和 TryUpdateModel 有什么用?以及哪个条件适用于使用 UpdateModel 或 TryUpdateMod
尝试让 UpdateModel 为我的用户工作。 User 类具有基本的字符串属性,如 CompanyName、FirstName、LastName 等,因此没有什么奇怪的。 这是我的 View 的标
我正在寻找对在运行时检索的子类使用 UpdateModel 方法,如果有人能够阐明我是否正在对其进行总哈希和/或是否是我的内容,那就太好了我尝试做的事情是可能的。 我正在使用通用操作来控制一堆部分 V
假设您有一个看起来像这样的模型: public class MyClass { public string Name { get; set; } public DateTime MyD
是否有可能在 MVC Controller 中有效地做这样的事情: var vmObject = Activator.CreateInstance("A string representing the
我正在尝试通过调用 UpdateModel(myObject, new[] { "stringprop1", "stringprop2", "intprop"}) 来更新一些对象属性。 由于未知原因而
这个问题在这里已经有了答案: Do you ever need to specify 'javascript:' in an onclick? (8 个答案) 关闭 5 年前。 我经常看到带有指定
如何使用ASP.NET MVC UpdateModel执行以下操作?我试图在空间中读取限定的文本框数据(就像新的StackOverflow问题中的TAGS文本框,例如这样)到模型中。 例如。 ...
我想在不知道 View 类型的 Controller 中使用 updateModel。我有不同的 View ,它们具有不同的类型,但都有一个ExternalBase 类作为继承类型。 所以在我的 Co
我是 MVC 的新手,所以正在学习 NerdDinner 教程,here .特别是,我在使用 UpdateModel 方法时遇到了问题,该方法在该教程的第五部分中进行了解释。问题是,当我尝试使用 Up
鉴于以下模型, public class A { public string Name { get; set; } } public class B { public string A
我有一个类似于日历的 ASP.NET MVC 应用程序。根据 NerdDinner 示例,我正在使用 UpdateMethod() 更新编辑页面的结果 在我的应用程序中,某些事件是完全可定制的,而某些
我有一个关于如何让 MVC Controller 的 UpdateModel/TryUpdateModel 的白名单和黑名单功能处理子对象的各个属性的问题。例如,假设我有一份问卷,收集有关填写表格的人
我不确定这是 DefaultModelBinder 类中的错误还是什么。 但是 UpdateModel 通常不会更改模型的任何值,除了它找到匹配的值。 看看以下内容: [AcceptVerbs(Htt
我是一名优秀的程序员,十分优秀!