比方说,我有一个C#方法,它做了一些类似的事情。
public void MyMethod()
{
A a = new A();
a.DoStuff();
}
有没有一种方法可以避免测试中的依赖注入,而不是传递一个... ... A
作为一个参数,以某种方式决定一个新的行为而不改变代码本身?我说的是一个伪代码。
public class B
{
public DoStuff() { //Same signature but does something else than A }
}
[TestMethod]
public void Test()
{
SetBehavior(typeof A, typeof B);
A a = new A();
a.DoStuff(); //here B implementation will be called
}
我认为你应该在DoStuff()周围添加一个抽象,而你的 MyMethod
应避免初始化一个 A
.
类似于:
public interface IDoer
{
void DoStuff();
}
public class A : IDoer
{
void DoStuff()
{
// do your stuff here
}
}
现在,在你的MyMethod中,你可以为IDoer添加一个额外的参数 或者在持有MyMethod的类中使用Dependency Injection。
所以,在你的Test项目中,你可以为IDoer添加额外的参数,或者在持有MyMethod的类中使用Dependency Injection。
public class MyClass
{
private readonly IDoer _doer;
public MyClass(IDoer doer)
{
_doer = doer;
}
public void MyMethod()
{
_doer.DoStuff();
}
}
现在,在你的测试项目中,你可以定义你的B类作为IDoer的替代实现,并创建你的B类 MyClass
与此实例。或者,您可以使用 Moq
以提供任何你想要的行为来代替它.}。