当T是接口时,如何在AutoMoqCustomization中使用IFixture.Build <T>()?

时间:2019-11-22 17:10:38

标签: c# unit-testing mocking moq autofixture

我有一个带有一些只读属性的接口:

interface IItem
{
    string Name { get; }
    // ... more properties
}

使用Fixture.Create()方法,我可以使用AutoMoqCustomization创建一个模拟的接口实例,如下所示:

var fixture = new Fixture();
fixture.Customize(new AutoMoqCustomization());

var mockedItem = fixture.Create<IItem>();

但是要使用Fixture.Build().CreateMany()创建这些接口实例的列表,我不能仅通过执行以下操作来做到这一点:

var mockedItems = fixture
    .Build<IItem>()
    .With(x => x.Name, "Abc")
    .CreateMany();

我需要Build()的原因是我想为某个属性具有某个返回值,而其余的属性仍可以自动生成。但是不幸的是,根据文档,使用Build()时,夹具上的所有自定义项都被绕过了。

我正在使用以下版本:AutoFixture 4.8.0,AutoFixture.AutoMoq 4.8.0和Moq 4.9.0。

是否有一种简单的方法无需定义自己的ISpecimenBuilder

2 个答案:

答案 0 :(得分:1)

可以从对象中提取模拟并进行配置

var mockedItems = fixture.CreateMany<IItem>(3);

foreach (var item in mockedItems) {
    Mock<IItem> mock = Mock.Get(item);
    mock.Setup(_ => _.Name).Returns("Abc");
}

答案 1 :(得分:0)

我认为在Autofixture中进行此操作的惯用方式(无需创建自己的ISpecimenBuilder实现)将依赖于自定义所创建的Mock标本的功能,以提供{{1} }标本:

IItem

公认的是,它不像在检索 之后自定义项目那样简洁,但是它确实允许您将标本的设置与创建过程分开,如果您需要重复使用该标本,那么这将是有益的标本,用于应该通过自动固定创建的其他标本。