多级依赖单元测试C#

时间:2014-02-06 19:32:08

标签: c# unit-testing dependency-injection

我有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。

非常感谢帮助。

此致 Suyog

1 个答案:

答案 0 :(得分:4)

当您为类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的可能实现之一(就像你的模拟对象一样)。