繁体   English   中英

AutoFixture AutoMoq 部分覆盖 class 构造函数

[英]AutoFixture AutoMoq partially covers class constructor

我正在使用 AutoFixture AutoMoq,它极大地简化了 class 中使用的所有接口的模拟并对其进行初始化。

虽然我注意到构造函数代码被部分覆盖,但我们可以修改AutoMoqDataAttribute以便也可以覆盖构造函数ArgumentNullException吗?

在此处输入图像描述

public class ServiceTest
{
    [Theory, AutoMoqData]
    public async Task Do_Test_For_DoMethod(Service sut)
    {
        await sut.DoMethod();
    }
}

AutoMoqData 属性 class,

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

    }
}

服务 class 代码,

 public class Service
{
    private readonly IServiceClient _serviceClient;
    private readonly ILogger<Service> _logger;

    public Service(IServiceClient serviceClient, ILogger<Service> logger)
    {
        _serviceClient = serviceClient ?? throw new ArgumentNullException(nameof(serviceClient));
        _logger = logger ?? throw new ArgumentNullException(nameof(logger));
    }


    public async Task DoMethod()
    {

        await _serviceClient.Do();
    }
}

AutoDataAttribute不负责了解如何覆盖您的代码。 表达意图并明确涵盖场景是开发人员的责任。

在您的情况下,未覆盖的分支是 null 警卫。 幸运的是 AutoFixture 专门为此提供了一个库AutoFixture.Idioms

这个库提供惯用的断言,封装了最基本的测试场景,如null保护、属性设置器、相等成员等。

使用这个库,您可以编写如下测试。

[Theory, AutoMockData]
void CheckGuards(GuardClauseAssertion assertion)
{
   assertion.Verify(typeof(Service));
}

这应该涵盖了所有构造函数的所有参数,而且好的部分是它使用了您的自定义,因此在尝试实例化您的 object 时它将生成有效数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM