[英]Mock C# class without passing the new behavior object as a parameter
假設我有一個 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 的 class 中使用依賴注入。
所以:
public class MyClass
{
private readonly IDoer _doer;
public MyClass(IDoer doer)
{
_doer = doer;
}
public void MyMethod()
{
_doer.DoStuff();
}
}
現在,在您的測試項目中,您可以將 B class 定義為 IDoer 的替代實現,並使用此實例創建您的MyClass
。 或者,您可以使用Moq
來提供您想要的任何行為。 }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.