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

时间:2013-06-25 22:12:29

标签: c# asp.net-mvc nunit

我已经阅读this并尝试了解决方案,但它对我不起作用。我试图理解这一点,也许我没有正确地测试它。我在控制器中的行上获得NullReferenceException,我正在测试ModelState。我使用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中读取它,一切正常。< / p>

1 个答案:

答案 0 :(得分:2)

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