模型验证在单元测试中不起作用
Model Validation Not Working In Unit Test
我有以下单元测试:
[TestMethod]
public void GivenInvalidUrlExpectInvalidModelState()
{
//Arrange
HomeController homeController = new HomeController();
InputFields inputFields = new InputFields { Url = "google.com/", KeyWords = "some key words" };
//Act
ViewResult actionResult = homeController.GetResults(inputFields);
//Assert
Assert.IsFalse(actionResult.ViewData.ModelState.IsValid);
}
以及以下型号:
public class InputFields
{
[Url]
[Required(ErrorMessage="Please provide a URL")]
public string Url { get; set; }
[Required(ErrorMessage="Please provide key words")]
public string KeyWords { get; set; }
}
当我从 UI 使用无效的 URL(没有协议)(例如 google.com/
)点击控制器时,ModelState
如预期的那样是假的。
然而在单元测试中,ModelState
为真。
为什么模型没有在单元测试中得到验证?
这些验证属性由 asp.net mvc 框架在 运行 时间内通过管道进行评估。当 运行 进行单元测试时,没有管道,因此某些期望不适用。
你必须自己操纵状态
[TestMethod]
public void GivenInvalidUrlExpectInvalidModelState() {
//Arrange
var homeController = new HomeController();
//manually adding error that would cause `ModelState.IsValid` to be false
homeController.ModelState.AddModelError("Url", "invalid data");
var inputFields = new InputFields { Url = "google.com/", KeyWords = "some key words" };
//Act
ViewResult actionResult = homeController.GetResults(inputFields);
//Assert
Assert.IsFalse(actionResult.ViewData.ModelState.IsValid);
}
为了测试管道内的模型状态,您可能需要 运行 端到端集成测试,其中向控制器发出 HTTP 请求
我有以下单元测试:
[TestMethod]
public void GivenInvalidUrlExpectInvalidModelState()
{
//Arrange
HomeController homeController = new HomeController();
InputFields inputFields = new InputFields { Url = "google.com/", KeyWords = "some key words" };
//Act
ViewResult actionResult = homeController.GetResults(inputFields);
//Assert
Assert.IsFalse(actionResult.ViewData.ModelState.IsValid);
}
以及以下型号:
public class InputFields
{
[Url]
[Required(ErrorMessage="Please provide a URL")]
public string Url { get; set; }
[Required(ErrorMessage="Please provide key words")]
public string KeyWords { get; set; }
}
当我从 UI 使用无效的 URL(没有协议)(例如 google.com/
)点击控制器时,ModelState
如预期的那样是假的。
然而在单元测试中,ModelState
为真。
为什么模型没有在单元测试中得到验证?
这些验证属性由 asp.net mvc 框架在 运行 时间内通过管道进行评估。当 运行 进行单元测试时,没有管道,因此某些期望不适用。
你必须自己操纵状态
[TestMethod]
public void GivenInvalidUrlExpectInvalidModelState() {
//Arrange
var homeController = new HomeController();
//manually adding error that would cause `ModelState.IsValid` to be false
homeController.ModelState.AddModelError("Url", "invalid data");
var inputFields = new InputFields { Url = "google.com/", KeyWords = "some key words" };
//Act
ViewResult actionResult = homeController.GetResults(inputFields);
//Assert
Assert.IsFalse(actionResult.ViewData.ModelState.IsValid);
}
为了测试管道内的模型状态,您可能需要 运行 端到端集成测试,其中向控制器发出 HTTP 请求