【发布时间】:2019-10-03 08:37:11
【问题描述】:
我有两个操作要做。一种用于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
}
}
现在,我将展示工厂类,它将根据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 类定义 interface?我必须mock工厂类还是设计错误?
【问题讨论】:
-
可以将
GetInstance方法标记为virtual,然后在继承MyFactory的类中覆盖它 -
为什么不定义一个
IFactory接口? -
首先,为什么控制器与实体紧密耦合而不与抽象松散耦合?
标签: c# unit-testing dependency-injection tdd