如何使AutoMoqCustomization使用Strict MockBehavior?

Str*_*ior 6 moq autofixture automoq

将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
}
Run Code Online (Sandbox Code Playgroud)

我想让Mocks用严格的行为创建,所以我们被迫调用Setup()我们期望被调用的方法.我可以为每个单独的模拟这样做:

fixture.Customize<Mock<IService>>(c => c.FromFactory(() => new Mock<IService>(MockBehavior.Strict)));
Run Code Online (Sandbox Code Playgroud)

但是在梳理了AutoMoqCustomization()的源代码以及各种ISpecimenBuilder其他实现之后,我很遗憾只能让所有的M​​ocks用严格的行为进行初始化.该框架看起来非常灵活和可扩展,所以我确信有一种简单的方法可以做到这一点 - 我无法弄清楚如何做到这一点.

Mar*_*ann 7

有没有内置的功能,使您能够做这样的事情很简单,但它不应该很难做到的。

本质上,您需要进行更改,MockConstructorQuery以便它调用接受一个MockBehavior值的构造函数并传入MockBehavior.Strict.

现在,您无法在 中更改该行为MockConstructorQuery,但该类只有 9-10 行代码,因此您应该能够创建一个新类,该类IMethodQuery通过使用MockConstructorQuery作为起点来实现。

同样,您还需要创建一个ICustomizationAutoMoqCustomization 几乎完全相同的自定义,唯一的例外是它使用IMethodQuery具有严格模拟配置的自定义而不是MockConstructorQuery. 这是您需要编写的另外 7 行代码。

综上所述,根据我的经验,使用严格的模拟是一个坏主意。它会使您的测试变得脆弱,并且您将浪费大量时间来修补“损坏的”测试。我只能建议你不要这样做,但现在我已经警告过你了;是你的脚