将 AutoFixture 与 AutoFixture.AutoMoq 包一起使用,我有时会发现未配置为正确测试他们要测试的东西的测试,但由于默认的(松散)模拟行为,从未发现问题:
public interface IService
{
bool IsSomethingTrue(int id);
}
void Main()
{
var fixture = new Fixture()
.Customize(new AutoMoqCustomization());
var service = fixture.Freeze<Mock<IService>>();
Console.WriteLine(service.Object.IsSomethingTrue(1)); // false
}
我想让 Mocks 使用严格的行为创建,所以我们不得不调用Setup()我们期望调用的方法。我可以像这样为每个单独的模拟执行此操作:
fixture.Customize<Mock<IService>>(c => c.FromFactory(() => new Mock<IService>(MockBehavior.Strict)));
但是在梳理了 AutoMoqCustomization() 的源代码以及各种ISpecimenBuilder和其他实现之后,我对让所有 Mocks 以严格行为初始化的最佳方法感到非常迷茫。该框架似乎非常灵活和可扩展,所以我确信有一种简单的方法可以做到这一点——我只是不知道怎么做。