c# – 使用AutoFixture数据理论进行AutoMock设置
作者:互联网
好的,正如我在other question中所回答的那样,默认情况下AutoMoq不使用AutoFixture.这很好,通过设置和设置ReturnsUsingFixture可以轻松解决.
但是可以使用自动夹具数据理论进行设置吗?
所以我们有一个自定义的AutoDataAttribute,我称之为[MyAutoData].在那里,我们调用并设置了一系列自定义,如AutoConfiguredMoqCustomization,将其配置为生成webapi控制器,以及注册大量自定义生成器.因此,我们已经能够将所有样板配置中的ALMOST提取到一些基本配置文件中.我们甚至为系统测试设置了MyAutoData属性,所以如果你要求,例如,Id< Account>它将使用实际的webapi调用创建一个新帐户并返回一个有效的帐户ID.
但是如何设置AutoMoq方法返回呢?这是一个例子:
[Theory, MyAutoData]
public async Task Test(Mock<ICqrsService> mockService, TheRequest request)
{
mockService.Setup(service => service.CreateAsync<TheRequest>(It.IsAny<TheRequest>(), It.IsAny<CancellationToken>()))
.ReturnsAsync(result); // or similar car with ReturnUsingFixture
/* now we can test */
}
在所有其他情况下,我们已经能够将这种配置移动到MyAutoData(或它调用的类).但对于AutoMoq,我看不出它应该如何工作.我们不能做一个夹具.
有没有办法在AutoFixture生成项目之后但在将其传递给测试方法之前触发设置方法?或者有没有办法自定义AutoMoq行为以便始终使用.ReturnsUsingFixture(fixture)?或者我只是在想这个问题都错了?
解决方法:
IPostprocessComposer<T>.Do(Action<T>)
方法允许您在创建样本后进一步自定义样本.
在您的情况下,您可以在自定义中使用它来在Test Double上设置泛型方法以返回由AutoFixture创建的对象:
public class FakeServiceCustomization : ICustomization
{
public void Customize(IFixture fixture)
{
fixture.Customize<Mock<IService>>(composer =>
composer.Do(fake =>
fake.Setup(service => service.Create<Something>())
.ReturnsUsingFixture(fixture);
}
}
标签:c,unit-testing,xunit,autofixture,automoq 来源: https://codeday.me/bug/20190528/1168769.html