我有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
答案 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
的可能实现之一(就像你的模拟对象一样)。