c# - 用 mock.Expect() 调用中的对象覆盖实例化对象

标签 c# rhino-mocks

我有一个正在测试的方法。

void MethodIAmTesting()
{
   SomeObject so = new SomeObject();

   _someService.AnotherMethodCall(so);
}

现在,我正试图在我的单元测试中模拟“so”。

void UnitTestMethod
{
   SomeObject testSO = new SomeObject();
   //Fill in data here.

   _classMock.Expect(instance => instance.AnotherMethodCall(testSO));

   _mainClass.MethodIAmTesting();
}

但是当我运行测试时,它只使用在真实方法中实例化的空版本。我怎样才能得到我正在调用的方法来使用我的 testSO 而不是真实代码中的 so?或者这是不可能的?

谢谢。

最佳答案

设计的一部分,测试驱动开发应该促使您转向依赖注入(inject)。通常,当您发现难以进行单元测试的内容时,那是因为您需要重新考虑您的设计。

在这种情况下,您的被测对象可能应该适合创建 SomeObject。相反,它应该提供给某人。也许它应该在您正在测试的类首次实例化时提供,也许它应该在您调用该方法时提供。例如:

public class ClassBeingTested
{    
  public ClassBeingTested(SomeObject so)
  {
    // Inject class dependency when instantiated the class
  }

  void MethodIAmTesting(SomeObject so)
  {
    // Passing things needed for a function to complete its work
  }   
}

此外,您很可能希望为 SomeObject 创建一个接口(interface)。然后你可以为它创建一个 stub 并轻松测试对其进行的调用、 stub 行为/属性等。当你以这种方式做事时,测试事情变得容易得多。例如,让我们考虑如何编写测试以确保 _someServiceSomeObject 提供:

void EnsureSomeObjectPassedToService()
{
   // arrange
   SomeObject so = new SomeObject()
   // act
   _mainClass.MethodIAmTesting(so);
   // assert
   _someObject.AssertWasCalled(x => x.AnotherMethodCall(so));
}

就是这样!当您做对事情时非常容易。

关于c# - 用 mock.Expect() 调用中的对象覆盖实例化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10624900/

相关文章:

Moq + CaSTLe 动态代理 - 异常模拟嵌套通用接口(interface)

c# - WPF DataGrid 似乎没有虚拟化行

C# 开关语法错误

c# - Convert.ToString() 中的条件表达式评估错误?

c# - SqlDataSource onSelected 事件未触发

c# - 枚举值的自定义名称

c# - 什么是等同于在 Rhino Mocks 中使用 Ordered() 的 AAA 语法

.net - rhino-mocks - 很好的示例应用程序