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
其他实现之后,我很遗憾只能让所有的Mocks用严格的行为进行初始化.该框架看起来非常灵活和可扩展,所以我确信有一种简单的方法可以做到这一点 - 我无法弄清楚如何做到这一点.
有没有内置的功能,使您能够做这样的事情很简单,但它不应该是很难做到的。
本质上,您需要进行更改,MockConstructorQuery
以便它调用接受一个MockBehavior
值的构造函数并传入MockBehavior.Strict
.
现在,您无法在 中更改该行为MockConstructorQuery
,但该类只有 9-10 行代码,因此您应该能够创建一个新类,该类IMethodQuery
通过使用MockConstructorQuery
作为起点来实现。
同样,您还需要创建一个ICustomization
与AutoMoqCustomization 几乎完全相同的自定义,唯一的例外是它使用IMethodQuery
具有严格模拟配置的自定义而不是MockConstructorQuery
. 这是您需要编写的另外 7 行代码。
综上所述,根据我的经验,使用严格的模拟是一个坏主意。它会使您的测试变得脆弱,并且您将浪费大量时间来修补“损坏的”测试。我只能建议你不要这样做,但现在我已经警告过你了;是你的脚
归档时间: |
|
查看次数: |
880 次 |
最近记录: |