0

我在所有测试中都使用相同的控制器实例,并且刚刚发现(因为我的测试以任意顺序运行)如果您Controller.View不带参数调用,它将传回ViewDataDictionary由先前调用创建的Controller.View具有参数的相同!

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

<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

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

  1. 明确指定Nothing所有空调用的模型Controller.View
  2. 添加TestSetUp清除模型的方法
4

2 回答 2

2

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

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

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

于 2012-09-10T10:37:46.167 回答
0

我相信在真正的 Web 应用程序(即不是测试模拟)中,会为每个请求创建一个单独的控制器实例。因此,在您的测试中,您可能应该这样做。

于 2012-09-10T10:37:50.877 回答