[英]How do I mock factory pattern to support unit testing?
我有兩個操作要做。 一種用於Air transport
,一種用於Road transport
。 兩者都處理一些message
。
這是Interface
public interface IProcess
{
void Process(string message);
}
這是我對Road transport
的實施
public class RoadTransport: IProcess
{
public void Process(string msg)
{
// do some road related operation
}
}
這是我的Air transport
實施
public class AirTransport: IProcess
{
public void Process(string msg)
{
// do some air related operation
}
}
現在,我將展示工廠 class,它將根據ID
返回不同的對象
public class MyFactory
{
private readonly AirTransport airtransport = null;
private readonly RoadTransport roadtransport = null;
public MyFactory(AirTransport, RoadTransport)// dependency injected
{
airtransport = AirTransport;
roadtransport = RoadTransport;
}
IProcess process = null;
public IProcess GetInstance(int id)
{
swicth(id)
{
case "1":
process = airtransport;
break;
case "2":
process = roadtransport;
break;
}
return process;
}
}
這是我應該測試的 class
public class HomeController:Controller
{
private readonly MyFactory _myfactory;
private readonly MyConfigurations _myConfigurations;
public HomeController(MyFactory factory, MyConfigurations configurations)
{
_myfactory = factory;
}
public IActionResult Index()
{
return View();
}
Public ActionResult Process(string message, string id)
{
var configurations = _myConfigurations;
if(configurations!=null)
{
IProcess processor= _myfactory.GetInstance(id);
processor.Process(message);
return View("Index");
}
}
}
我如何對這個 controller 進行單元測試,因為沒有為factor
class 定義interface
? 我必須mock
工廠 class 還是設計錯誤?
我是否必須模擬工廠 class
沒有。 不要模擬實現問題,模擬抽象。
還是設計錯誤?
這不是一個靈活的設計,因為您的類與不適合獨立單元測試的具體/實現問題緊密耦合。
我如何對這個 controller 進行單元測試,因為沒有為因子 class 定義接口?
然后為工廠定義一個抽象(契約)。 (可以是接口或抽象類)
public interface IProcessFactory {
IProcess GetInstance(int id);
}
並讓實現派生自抽象
public class MyFactory : IProcessFactory {
//...
}
現在可以重構 controller 以通過構造函數注入顯式依賴抽象。
public class HomeController : Controller {
private readonly IProcessFactory factory;
private readonly MyConfigurations configurations;
public HomeController(IProcessFactory factory, MyConfigurations configurations) {
this.factory = factory;
this.configurations = configurations;
}
//...omitted for brevity
}
這現在允許在單獨測試 controller 時替換模擬。
假設MyConfigurations
是一個 POCO 存儲設置/選項,不屬於需要抽象的功能問題。
最后一步是確保將實際派生的工廠實現注入生產中的 controller。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.