簡體   English   中英

模擬 C# class 而不傳遞新行為 object 作為參數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM