C# 如何模拟工厂模式以支持单元测试?

C# 如何模拟工厂模式以支持单元测试?,c#,unit-testing,dependency-injection,tdd,C#,Unit Testing,Dependency Injection,Tdd,我有两个手术要做。一个用于航空运输,另一个用于公路运输。两者都处理一些消息 这是界面 public interface IProcess { void Process(string message); } 以下是我对道路运输的实施 public class RoadTransport: IProcess { public void Process(string msg) { /

我有两个手术要做。一个用于
航空运输
,另一个用于
公路运输
。两者都处理一些
消息

这是
界面

   public interface IProcess
   {
        void Process(string message);
   }
以下是我对
道路运输的实施

     public class RoadTransport: IProcess 
     {
         public void Process(string msg)
         {
             // do some road related operation
          }
     }
     public class AirTransport: IProcess 
     {
         public void Process(string msg)
         {
             // do some air related operation
         }
     }
这是我对
航空运输的实现

     public class RoadTransport: IProcess 
     {
         public void Process(string msg)
         {
             // do some road related operation
          }
     }
     public class AirTransport: IProcess 
     {
         public void Process(string msg)
         {
             // do some air related operation
         }
     }
现在,我将展示factory类,它将根据
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;
        }
   }
这是我要考的课

  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");
            }
        }
  }
由于没有为
因子
类定义
接口,我如何对该控制器进行单元测试?我必须模拟工厂类还是设计错误

我必须模仿工厂课程吗

。不要模拟实现问题、模拟抽象

还是设计错误

它不是一个灵活的设计,因为您的类与具体化/实现问题紧密耦合,不适合单独的单元测试

由于没有为factor类定义接口,我如何对该控制器进行单元测试

然后为工厂定义一个抽象(契约)。(可以是接口或抽象类)

并让实现源于抽象

public class MyFactory : IProcessFactory {
    //...
}
控制器现在可以通过构造函数注入进行重构,以显式地依赖于抽象

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

}
这现在允许在隔离测试控制器时替换模拟

假设
MyConfigurations
是一个POCO存储设置/选项,不属于需要抽象的功能关注点


最后一步是确保实际派生的工厂实现在生产中注入控制器。

您可以将
GetInstance
方法标记为
virtual
,然后在继承
MyFactory
的类中重写它。首先,为什么不指定
IFactory
接口,为什么控制器与具体化紧密耦合,而不是与抽象松散耦合?