C# 模拟IOC统一对象创建调用 公共类ExcelHelper:IExcelHelper { 专用ICustomLoadRepository\u customLoadRepository; public ExcelHelper(IUnityContainer unityContainer) { _customLoadRepository=unityContainer.Resolve(); } }

C# 模拟IOC统一对象创建调用 公共类ExcelHelper:IExcelHelper { 专用ICustomLoadRepository\u customLoadRepository; public ExcelHelper(IUnityContainer unityContainer) { _customLoadRepository=unityContainer.Resolve(); } },c#,unit-testing,dependency-injection,rhino-mocks,C#,Unit Testing,Dependency Injection,Rhino Mocks,我们已经开始使用Rhinomock对代码进行单元测试 不知道如何模拟代码行 public class ExcelHelper : IExcelHelper { private ICustomLoadRepository _customLoadRepository; public ExcelHelper(IUnityContainer unityContainer) { _customLoadRepository= unityContainer.Resol

我们已经开始使用Rhinomock对代码进行单元测试

不知道如何模拟代码行

public class ExcelHelper : IExcelHelper
{
    private ICustomLoadRepository _customLoadRepository;
    public ExcelHelper(IUnityContainer unityContainer)
    {
         _customLoadRepository= unityContainer.Resolve<ICustomLoadRepository>(); 
    }
}
\u customLoadRepository=unityContainer.Resolve();
我们不希望通过从构造函数参数传递来解决这个问题,因为在类中,此类参数的数量有时会超过7-8个。

这似乎是一个问题

也就是说,通常认为将容器作为依赖项注入到任何类中都是一种不好的做法,因为它违背了使用依赖项注入的目的。这种设计与服务定位器模式有更多的共同点。在这种情况下,这被认为是一种反模式

你应该改为练习

方法和类应该明确要求(通常通过方法参数或构造函数参数)它们需要的任何协作对象才能正常工作。

具有显式依赖关系的类更诚实。它们非常清楚地说明了执行特定功能所需的内容

这可以通过使用或任何其他模拟框架注入抽象依赖项的模拟来轻松测试

public class ExcelHelper : IExcelHelper {
    private readonly ICustomLoadRepository customLoadRepository;

    public ExcelHelper(ICustomLoadRepository customLoadRepository) {
         this.customLoadRepository = customLoadRepository;
    }

    //...
}
public void Some\u unit\u test(){
//安排
var stubCustomLoadRepository=MockRepository.GenerateSub();
stubCustomLoadRepository.Stub(=>u.SomeCustomLoadMethod()).Return(“somevalue”);
var classUnderTest=新的ExcelHelper(stubCustomLoadRepository);
//表演
//…测试中的练习课
//断言
//...
}
至于你关于有很多构造函数参数的说法

我们不希望通过传递构造函数参数来解决这个问题,因为在每个类上,这样的参数数量有时会超过7-8个

我认为这是代码的味道。这通常表明您的类正在尝试做太多的事情。违反法律的行为

所以从所有迹象来看,你似乎有一个设计问题。检查您的类,并尝试使用聚合依赖项重构它们。考虑一个更坚实的设计原则。

public class ExcelHelper : IExcelHelper {
    private readonly ICustomLoadRepository customLoadRepository;

    public ExcelHelper(ICustomLoadRepository customLoadRepository) {
         this.customLoadRepository = customLoadRepository;
    }

    //...
}
public void Some_unit_test() {
    //Arrange
    var stubCustomLoadRepository = MockRepository.GenerateStub<ICustomLoadRepository>();
    stubCustomLoadRepository.Stub(_ => _.SomeCustomLoadMethod()).Return("Some value");

    var classUnderTest = new ExcelHelper(stubCustomLoadRepository);

    //Act
    //...exercise class under test

    //Assert
    //...
}