0

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

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

在此处输入图像描述

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

AutoMoqData 属性类,

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

    }
}

服务类代码,

 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();
    }
}
4

1 回答 1

2

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

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

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

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

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

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

于 2022-01-26T07:47:15.123 回答