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));
}
这应该涵盖所有构造函数的所有参数,好的部分是它使用您的自定义,因此它会在尝试实例化您的对象时生成有效数据。
我正在使用 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));
}
这应该涵盖所有构造函数的所有参数,好的部分是它使用您的自定义,因此它会在尝试实例化您的对象时生成有效数据。