![](/img/trans.png)
[英]AutoFixture.AutoMoq supply a known value for one constructor parameter
[英]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.