unit-testing - 为什么 AutoFixture 的 AutoMoqData 不创建模拟对象?

标签 unit-testing nunit moq autofixture

我正在编写 ( NUnit ) 单元测试,其目标是 MyService 类型的组件。示例:

public class MyService : IMyService
{
    private readonly IMyRepo _myRepo;

    public MyService (IMyRepo myRepo)
    {
        _myRepo = myRepo;
    }

    public MyService ()
    {
        _myRepo = new MyRepo();
    }
    ...
}

我正在尝试使用AutoFixture作为factory这将生成我的测试目标。我还尝试让它(AutoFixture)用模拟依赖项填充我的目标(使用 Moq )。

这是我这样做的尝试:

[Test, AutoMoqData]
public void MyTest(MyService target)
{
    ...
}

[AutoMoqData]属性(基于 @ploeh's blog post )扩展了 AutoFixture 的 [AutoData] AutoFixture 的 AutoMoqCustomization 属性特点:

public class AutoMoqDataAttribute : AutoDataAttribute
{
    public AutoMoqDataAttribute()
        : base(new Fixture()
            .Customize(new AutoMoqCustomization()))
    {
    }
}

当我基于上述运行单元测试时,我想获得 MyService 的真实实例与 Mock<IMyRepo>里面的依赖。 相反,我得到了 MyRepo 的具体实例。

看来AutoMoqCustomization选择调用最简单的构造函数 - 没有参数的构造函数。 如何配置AutoMoqCustomization忽略它并实例化第二个构造函数

PS -以下是正在使用的相关 nuget 包的列表:
<package id="AutoFixture" version="3.50.2" targetFramework="net452" /> <package id="AutoFixture.AutoMoq" version="3.50.2" targetFramework="net452" /> <package id="AutoFixture.NUnit3" version="3.50.2" targetFramework="net452" /> <package id="Moq" version="4.5.29" targetFramework="net452" /> <package id="NUnit" version="3.5.0" targetFramework="net452" />

最佳答案

您可以尝试define a greedy constructor selection algorithm for AutoFixture ,但实际上,最好的解决方案是删除无参数构造函数:

public class MyService : IMyService
{
    private readonly IMyRepo _myRepo;

    public MyService (IMyRepo myRepo)
    {
        _myRepo = myRepo;
    }
}

拥有无参数构造函数是一种称为 SCSS 注入(inject)的代码味道。在大多数情况下,没有充分的理由。

在我看来,最好的选择是应用 GOOS聆听测试的原则。当测试变得难以编写时,就需要重新考虑被测系统 (SUT) 的设计。 AutoFixture 往往会放大这种效果。这就是这里发生的事情。

关于unit-testing - 为什么 AutoFixture 的 AutoMoqData 不创建模拟对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41920090/

相关文章:

java - JUnit 中检查两个列表是否相同

c# - 在 selenium c# 中找不到类型或命名空间 SelectElement

c# - 带有 setName 的 Nunit TestCaseSource 还在 testexplorer 中显示原始测试

c# - 如何为.NET项目中的单元测试创​​建GitHub Action?

c# - 无法在 C# 2010 中引用 moq.dll

unit-testing - MOQ 和 AutoFixture 之间有什么区别?

c# - 管理员返回 null 但为什么?

node.js - 使用 mocha 测试二进制文件上传

java - 使用 'this' 关键字调用 Mockito stub 方法

ios - XCTests过早取消