为什么调用不带参数的Controller.View不能清除ViewData.Model

时间:2012-09-10 10:34:21

标签: asp.net-mvc unit-testing

我在所有测试中使用相同的控制器实例,并且刚刚发现(因为我的测试以任意顺序运行),如果你在没有参数的情况下调用Controller.View,它将传回相同的{{1这是由先前调用ViewDataDictionary创建的,它有参数!

一个简单的例子(使用NUnit和MvcContrib)

Controller.View

这对我的测试很不利(显然)。我可以想象两种解决方案,我都不喜欢,有什么建议吗? (作为奖励,任何人都可以理解为什么MS以这种方式设计它吗?)

  1. 明确指定<Test()> _ Public Sub Test_A() Dim r As ViewResult = MockController.MethodWhichReturnsViewData().AssertViewRendered() Assert.IsNotNull(r.Model) End Sub <Test()> _ Public Sub Test_B() Dim r As ViewResult = MockController.MethodWhichDoesNotReturnViewData().AssertViewRendered() Assert.IsNull(r.Model) '<==== fails, has the same view data as Test_A! End Sub 作为Nothing
  2. 的所有空调用的模型
  3. Controller.View添加方法以清除模型

2 个答案:

答案 0 :(得分:2)

确保为每个单元测试创​​建SUT(测试对象)的新实例。在NUnit中,将在使用[Setup]属性装饰的方法内完成:

<Setup()> _
Public Sub Init()
    ' Instantiate the SUT here
    MockController = ...
End Sub

不要使用任何静态字段。 MockController应该是测试夹具类的私有实例字段。

答案 1 :(得分:0)

我相信一个真实的Web应用程序(即不是测试模拟),为每个请求创建一个单独的控制器实例。所以在你的测试中你应该也这样做。