簡體   English   中英

如何模擬工廠模式以支持單元測試?

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

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