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 没有责任了解如何覆盖您的代码。开发人员有责任表达意图并明确涵盖场景。

在你的例子中,未覆盖的分支是空守卫。幸运的是,AutoFixture 专门为此提供了一个库,AutoFixture.Idioms.

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

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

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

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