我有这个工厂类,我想正确测试它。假设我有一个抽象类,它有很多孩子(继承)。
正如您在我的 Factory 类中看到的 BuildChild 方法,我希望能够在运行时创建子类的实例。我必须能够在运行时创建此实例,因为在运行之前不会知道类型。而且,我不能在这个项目中使用 Unity(如果是这样,我不会问如何实现这一点)。
这是我要测试的工厂类:
public class Factory
{
public AnAbstractClass BuildChild(Type childType, object parameter)
{
AnAbstractClass child = (AnAbstractClass) Activator.CreateInstance(childType);
child.Initialize(parameter);
return child;
}
}
为了测试这一点,我想找到一种方法来模拟 Activator.CreateInstance 来返回我自己的子类的模拟对象。我怎样才能做到这一点?或者,如果您有更好的方法可以在不使用 Activator.CreateInstance(和 Unity)的情况下做到这一点,如果它更容易测试和模拟,我会接受它!
我目前正在使用 Moq 创建我的模拟,但由于 Activator.CreateInstance 是来自静态类的静态方法,我无法弄清楚如何做到这一点(我已经知道 Moq 只能创建对象的模拟实例)。
我查看了来自 Microsoft 的 Fakes,但没有成功(我在理解它的工作原理和找到一些解释清楚的示例时遇到了一些困难)。
请帮我!
编辑:
我需要模拟 Activator.CreateInstance 因为我想强制此方法返回另一个模拟对象。我想要的正确方法只是存根这个方法(而不是模拟它)。
所以当我像这样测试 BuildChild 时:
[TestMethod]
public void TestBuildChild()
{
var mockChildClass = new Mock(AChildClass);
// TODO: Stub/Mock Activator.CreateInstance to return mockChildClass when called with "type" and "parameter" as follow.
var type = typeof(AChildClass);
var parameter = "A parameter";
var child = this._factory.BuildChild(type, parameters);
}
使用类型和参数调用的 Activator.CreateInstance 将返回我的模拟对象,而不是创建真实子类的新实例(尚未实现)。