模型验证在单元测试中不起作用

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 请求