【发布时间】:2022-01-04 08:18:53
【问题描述】:
我正在尝试为一个构造函数依赖于Func<T> 的类编写测试。为了成功完成被测函数,需要创建多个 T 类型的单独对象。
在生产环境中运行时,AutoFac 每次调用 factory() 时都会生成一个新的 T,但是当使用 AutoMock 编写测试时,它会在再次调用时返回相同的对象。
下面的测试用例显示了使用 AutoFac 和 AutoMock 时的行为差异。我希望这两个都能通过,但 AutoMock 失败了。
public class TestClass
{
private readonly Func<TestDep> factory;
public TestClass(Func<TestDep> factory)
{
this.factory = factory;
}
public TestDep Get()
{
return factory();
}
}
public class TestDep
{}
[TestMethod()]
public void TestIt()
{
using var autoMock = AutoMock.GetStrict();
var testClass = autoMock.Create<TestClass>();
var obj1 = testClass.Get();
var obj2 = testClass.Get();
Assert.AreNotEqual(obj1, obj2);
}
[TestMethod()]
public void TestIt2()
{
var builder = new ContainerBuilder();
builder.RegisterSource(new AnyConcreteTypeNotAlreadyRegisteredSource());
var container = builder.Build();
var testClass = container.Resolve<TestClass>();
var obj1 = testClass.Get();
var obj2 = testClass.Get();
Assert.AreNotEqual(obj1, obj2);
}
【问题讨论】:
-
你能告诉我们更多关于你为什么这样做的原因吗?例如,通常 Autofac 从容器中填写
Func<T>,而您只需注册T。您是否尝试过创建一个真实的容器,但里面有模拟对象?您可能可以通过以不同的方式进行模拟来解决问题,因此知道为什么可以帮助人们更好地回答您。 -
感谢您的回复。我更新了我的代码示例,希望能更清楚一点,所以我们有
TestIt使用 AutoMock 和TestIt2直接使用 Autofac。 -
在这种情况下,我认为模拟对象并不是特别相关(尽管我们真正的测试用例确实包括它们)。我想我们可以在这里直接使用 Autofac - 尽管很高兴了解为什么会发生这种情况,这样我们就可以正确决定将来何时使用 AutoMock/Autofac。
-
使用 AutoMock 的源代码逐步完成我的测试 - 看起来默认注册是 InstancePerLifetimeScope,而不是 AutoFac 默认的 InstancePerDependency。这肯定会导致我所看到的!