我在所有测试中使用相同的控制器实例,并且刚刚发现(因为我的测试以任意顺序运行),如果你在没有参数的情况下调用Controller.View
,它将传回相同的{{1这是由先前调用ViewDataDictionary
创建的,它有参数!
一个简单的例子(使用NUnit和MvcContrib)
Controller.View
这对我的测试很不利(显然)。我可以想象两种解决方案,我都不喜欢,有什么建议吗? (作为奖励,任何人都可以理解为什么MS以这种方式设计它吗?)
<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
Controller.View
添加方法以清除模型答案 0 :(得分:2)
确保为每个单元测试创建SUT(测试对象)的新实例。在NUnit中,将在使用[Setup]
属性装饰的方法内完成:
<Setup()> _
Public Sub Init()
' Instantiate the SUT here
MockController = ...
End Sub
不要使用任何静态字段。 MockController
应该是测试夹具类的私有实例字段。
答案 1 :(得分:0)
我相信一个真实的Web应用程序(即不是测试模拟),为每个请求创建一个单独的控制器实例。所以在你的测试中你应该也这样做。