编程语言
首页 > 编程语言> > c# – 使用AutoFixture数据理论进行AutoMock设置

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