gpt4 book ai didi

c# - 模拟静态方法 Activator.CreateInstance 以返回另一个类的模拟

转载 作者:太空宇宙 更新时间:2023-11-03 20:15:09 25 4
gpt4 key购买 nike

我有这个工厂类,我想正确地测试它。假设我有一个抽象类,它有很多子类(继承)。

正如您在我的工厂类中看到的方法 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,因为我想强制此方法返回另一个模拟对象。我想要的正确的事情只是 stub 这个方法(而不是模拟它)。

所以当我像这样测试 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 将返回我的模拟对象,而不是创建真实子类(尚未实现)的新实例。

最佳答案

嗯,我很想说这不是你需要模拟的东西,因为它应该被信任被测试,但我想如果类型来自外部源库,那么你可能会有问题......也就是说,实现此目的的唯一方法是包装 Activator,使其不是静态类。

像这样:

public ActivatorWrapper
{
public virtual object CreateInstance(Type type)
{
return Activator.CreateInstance(type);
}
}

关于c# - 模拟静态方法 Activator.CreateInstance 以返回另一个类的模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17374196/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com