首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模拟IOC Unity对象创建调用

模拟IOC Unity对象创建调用
EN

Stack Overflow用户
提问于 2018-02-26 11:52:24
回答 1查看 41关注 0票数 1
代码语言:javascript
复制
public class ExcelHelper : IExcelHelper
{
    private ICustomLoadRepository _customLoadRepository;
    public ExcelHelper(IUnityContainer unityContainer)
    {
         _customLoadRepository= unityContainer.Resolve<ICustomLoadRepository>(); 
    }
}

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

不确定如何模拟代码行

代码语言:javascript
复制
_customLoadRepository = unityContainer.Resolve<ICustomLoadRepository>();

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

EN

回答 1

Stack Overflow用户

发布于 2018-02-26 18:30:03

这似乎是一个XY problem

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

您应该改为练习Explicit Dependencies Principle

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

..。

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

代码语言:javascript
复制
public class ExcelHelper : IExcelHelper {
    private readonly ICustomLoadRepository customLoadRepository;

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

    //...
}

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

代码语言:javascript
复制
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
    //...
}

至于你关于有很多构造函数参数的说法,

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

我认为这是一种代码气味。这通常表明您的类正在尝试做太多的事情。违反了Single Responsibility Principle (SRP)

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48981201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档