gpt4 book ai didi

moq - 如何使AutoMoqCustomization使用严格的MockBehavior?

转载 作者:行者123 更新时间:2023-12-04 15:09:33 24 4
gpt4 key购买 nike

结合使用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都具有严格行为进行初始化的最佳方法,我颇为失落。该框架看起来非常灵活和可扩展,所以我敢肯定有一种简单的方法可以做到这一点-我只是不知道怎么做。

最佳答案

没有简单的内置功能可以使您执行类似的操作,但这并不难。

本质上,您需要更改 MockConstructorQuery ,以便它调用采用MockBehavior值的构造函数,并传入MockBehavior.Strict

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

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

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

关于moq - 如何使AutoMoqCustomization使用严格的MockBehavior?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34055672/

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