gpt4 book ai didi

c# - 为什么 Controller.UpdateModel 不使用单元测试中的全局化验证属性验证模型?

转载 作者:行者123 更新时间:2023-11-30 12:58:14 27 4
gpt4 key购买 nike

我创建了一个 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com