我有一个带有一些只读属性的接口:
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
?
答案 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
公认的是,它不像在检索 之后自定义项目那样简洁,但是它确实允许您将标本的设置与创建过程分开,如果您需要重复使用该标本,那么这将是有益的标本,用于应该通过自动固定创建的其他标本。