【发布时间】:2019-06-29 21:42:00
【问题描述】:
最近,我看到了这段代码。由于我试图一次学习很少的东西,我遇到了这段代码的问题,但不知道如何解决。我希望能够对此代码进行单元测试
public static class CarFactory
{
private static readonly IDictionary<string, Type> CarsRegistry = new Dictionary<string, Type>();
public static void Register<TCar>(string car) where TCar : CarBase, new()
{
if (!CarsRegistry.ContainsKey(car))
{
CarsRegistry.Add(car, typeof(TCar));
}
}
public static ICar Create(string car)
{
if (CarsRegistry.ContainsKey(car))
{
CarBase newCar = (CarBase)Activator.CreateInstance(CarsRegistry[car]);
return newCar;
}
throw new NotSupportedException($"Unknown '{car}'");
}
}
我对这段代码有一些问题。
- 名称是 CarFactory,但这在我看来不像工厂模式。它看起来更像定位器模式
- 该类是静态的 - 我听说静态类不利于在 Moq 等框架中进行单元测试,而且它们还隐藏了依赖项。假设另一个常规类中的方法使用这个,对于单元测试,没有办法知道该方法依赖于这个静态类
我想确保正确调用这个类,并且根据我的阅读,我认为这是定位器模式。
我还想对这个类进行单元测试,需要帮助以使其可使用 Moq 进行单元测试。
感谢@ErikPhillips 下面的解释,我现在明白使用这个类的其他类是不可测试的。所以,如果我有一个像下面这样的课程:
public class CarConsumer
{
public void ICar GetRedCar()
{
var result = CarFactory.Create("Tesla");
result.Color = Color.Red;
return result;
}
}
,GetRedCar() 方法将难以测试,因为它使用 CarFactory 静态类,对于单元测试或外部客户端,GetRedCar() 方法 API 中没有任何内容表明它依赖于这个静态类。
我想重构 CarFactory 类,以便其他使用它的类(例如上面的 CarConsumer 类)可以正确测试。
【问题讨论】:
标签: c# unit-testing moq factory-pattern service-locator