【问题标题】:Cannot mock class with constructor having array parameter using Rhino Mocks无法使用 Rhino Mocks 模拟具有数组参数的构造函数的类
【发布时间】:2010-05-18 07:35:04
【问题描述】:

我们无法在 RhinoMocks 中模拟这个类。

public class Service
{
    public Service(Command[] commands){}
}
public abstract class Command {}

// Code
var mock = MockRepository.GenerateMock<Service>(new Command[]{}); // or
mock = MockRepository.GenerateMock<Service>(null)

Rhino 模拟失败,抱怨找不到具有匹配参数的构造函数。 我做错了什么?

谢谢,

【问题讨论】:

    标签: c# mocking rhino-mocks


    【解决方案1】:

    试试这样:

    var mock = MockRepository.GenerateMock<Service>(
        new object[] { new Command[0] }
    );
    

    【讨论】:

      【解决方案2】:

      此外,您可以使用接口包装 Service 而不必担心构造函数参数。如果构造函数发生变化——您的测试将与这些实现细节相关联并且需要更新。

      var mock = MockRepository.GenerateMock<IService>();
      

      编辑:至少隔离该 Mock 的创建,因此如果您在 Service 上的构造函数发生更改,您不必在每个地方都进行更新。一种常见的做法如下:

      (在你的测试课中)

      private ObjectWithServiceDependency CreateObjectUnderTest(){
           //Here you would inject your Service dependency with the above answer from Darin
           //i.e.
           var mockService= MockRepository.GenerateMock<Service>(new object[] {new Command[0] });
           var objectUnderTest = new ObjectWithServiceDependency(mockService);
           return objectUnderTest;
      }
      

      然后在测试中,

      [Test]
      public TestSomething(){
           var out = CreateObjectUnderTest();
           //do testing
           mockService.Expect(...);
      }
      

      【讨论】:

      • 为了模拟,我不是接口的最大粉丝。但是,您将拥有与知道构造函数参数和类型的测试相关的技术债务。我将编辑我的示例,以展示一个好的做法,至少在构造函数需要更改时隔离需要更改的地方。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-04
      • 2022-01-27
      • 2012-04-28
      相关资源
      最近更新 更多