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
接口,为什么控制器与具体化紧密耦合,而不是与抽象松散耦合?