【问题标题】:multi level dependency unit test C#多级依赖单元测试 C#
【发布时间】:2014-02-06 19:32:08
【问题描述】:

我有 3 个班级:A 级、B 级和 C 级。

Class A
{
    public void doSomething()
    {
        var b = new B();
        b.doSomething();
    } 
}

Class B
{
    public void doSomething()
    {
        var c = new C();
        c.doSomething();
    }
}

Class C
{
    public void doSomething()
    {
        //do something
    }   
}

我必须使上述代码可测试。所以我打算使用依赖注入。重构后我的代码是这样的

public interface InterfaceB
{
    void doSomething();
}

public class A
{
    private InterfaceB _b;

    public A(InterfaceB b)
    {
        _b = b;
    }

    public void doSomething()
    {
        _b.doSomething();
    }
}

public interface InterfaceC
{
    void doSomething();
}  

public class B : InterfaceB
{
    private InterfaceC _c;

    public B(InterfaceC c)
    {
        _c = c;
    }

    public void doSomething()
    {
        _c.doSomething();
    }
}

public class C : InterfaceC
{
    public void doSomething()
    {
        // do something
    }
}

Main()
{
    var a = new A(new ClassB());
}

我很清楚第一级依赖注入。我如何进行第二级依赖注入,而我的 ClassB 又依赖于 ClassC。

感谢您的帮助。

问候, 苏约格

【问题讨论】:

  • 究竟什么不清楚?
  • 我很确定你已经设置了所有的依赖注入。 B 被注入到 A 中,C 被注入到 B 中。只需像这样创建一个实例:var a = new A(new ClassB(new ClassC));
  • A 会采用 B 和 C 接口吗?我读到的是 A 不应该知道 C,因为它只依赖于 B。
  • 在 Joroen 的例子中,A 不知道 C——类 creating A (Main()) 知道 C。

标签: c# unit-testing dependency-injection


【解决方案1】:

当您为 A 类编写单元测试时,您应该只提供它的 直接 依赖项的模拟,即在您的情况下,它将模拟 InterfaceB:

 private void AShouldDelegateWorkToB()
 {
     Mock<InterfaceB> bMock = new Mock<InterfaceB>();     
     A a = new A(bMock.Object);
     a.DoSomething();
     bMock.Verify(b => b.DoSomething(), Times.Once);
 }

您不应该关心B 的实现——它是否将其工作委托给其他某个类C 或全部自行完成。这是B 类实现的细节,应该通过B 类的测试来测试。请记住,A 类甚至不知道B 类的存在——这只是InterfaceB 的可能实现之一(就像您的模拟对象一样)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-27
    • 2021-06-19
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多