为什么在运行单元测试时,我的ModelState为null

本文关键字:我的 ModelState null 运行 单元测试 为什么 | 更新日期: 2023-09-27 18:20:04

我已经阅读了这篇文章,并尝试了解决方案,但它对我不起作用。我正在努力理解这一点,也许我没有正确测试这一点。我在测试ModelState的控制器中得到了一个NullReferenceException。我正在使用MVC 3和NUnit作为我的测试套件。ShouldBeViewNamed("Index")是我编写的一个扩展方法,用于测试我要返回的视图的名称,但在执行代码时,我甚至没有做到这一点。这是我的控制器:

public class TestController : Controller
{
    [HttpPost]
    public ViewResult Index(TestModel model)
    {
        if(ModelState.IsValid) // results in a null reference exception.
            return View();
        return new ViewResult();
    }
}

测试类别:

[TestFixture]
public class TestControllerTest
{
    [Test]
    public void TestingModelState()
    {
        // Arrange
        var model = new TestModel();
        var controller = new TestController();
        // Arbitrary values to indicate an error in the model
        controller.ModelState.AddModelError("tester1", "error happened"); 
        // Act
        var result = controller.Index(model);
        // Assert
        result.ShouldBeViewNamed("Index");
    }
}

根据我读过的大多数博客,这应该"只是工作"。但无论我做什么,ModelState总是空的。。。如果这对其他人有效,我会认为这与我的本地设置或我们使用的框架有关。我让另一位开发人员在我的商店测试过这个,他也得到了同样的异常。

编辑:我已将问题缩小到特定于此特定项目。通过向解决方案中添加一个新项目并使用相同的测试进行测试,我无法重复此问题。不用说,这是一个2009年开始的继承项目,可能是一个MVC 1项目,已经升级到MVC 3。接下来我将查看项目级别的设置。

编辑:请参阅下面的答案,原来我们不久前聘请的一位顾问试图将项目升级到MVC 4,遇到了一些问题,并且从未恢复文件。大多数单元测试仍然通过,项目运行良好,但NUnit项目对MVC 4的引用不好。我不得不手动从.csproj文件中删除引用,并在VS中读取它,一切都正常。

为什么在运行单元测试时,我的ModelState为null

确保NUnit项目引用的System.Web.Mvc.dll版本与Mvc项目相同。