【问题标题】:Model Validation Not Working In Unit Test模型验证在单元测试中不起作用
【发布时间】:2018-10-08 20:41:32
【问题描述】:

我有以下单元测试:

[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 框架在运行时通过管道进行评估。运行单元测试时,没有管道,因此某些期望不适用。你必须自己操纵状态

标签: c# asp.net-mvc unit-testing modelstate


【解决方案1】:

这些验证属性由 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 请求

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-25
    • 1970-01-01
    • 1970-01-01
    • 2020-09-06
    • 2016-08-08
    相关资源
    最近更新 更多