gpt4 book ai didi

moq - AutoFixture.AutoMoq : set value to read only property

转载 作者:行者123 更新时间:2023-12-02 17:49:58 24 4
gpt4 key购买 nike

我将 AutoFixture 与 AutoMoq 一起使用。我尝试创建一个类的假实例,该类的属性带有 getter 但没有 setter。我希望 AutoFixture 能够配置模拟,这样即使没有 setter ,它也会返回给定的值。

我的代码是这样的:

var data = new List<Data>() { new Data() };
var userManager = fixture.Build<IRepository>()
//.With(x => x.Data, data)
.CreateAnonymous();
Mock.Get(userManager).Setup(x => x.Data).Returns(data);

不幸的是,“With”方法在这种情况下不起作用,因为自动固定装置表示数据没有任何 setter ,这就是为什么我必须在之后直接调用模拟来设置值。

有没有一种方法可以让自动夹具自己完成此操作,这样我就不需要最后一行代码?

编辑:我犯了一个错误,代码示例不起作用。应该是

var data = new List<Data>() { new Data() };
var userManager = fixture.CreateAnonymous<IRepository>();
Mock.Get(userManager).Setup(x => x.Data).Returns(data)

不过,如果有一个用于假实例的 with 方法,那就太好了。

最佳答案

AutoFixture.AutoMoq doesn't set up your Test Doubles为你。

如果您想避免在每个测试用例中指定 IRepository.Data 设置,您可以将设置打包在 Customization 中。 .

public class RepositoryCustomization : ICustomization
{
public void Customize(IFixture fixture)
{
fixture.Register(() =>
{
var td = new Mock<IRepository>();
td.SetupGet(r => r.Data).Returns(fixture.CreateMany<Data>());
return td.Object;
});
}
}

这样,以下测试就通过了:

[Fact]
public void AutoProperty()
{
var fixture = new Fixture().Customize(new RepositoryCustomization());
var repo = fixture.Create<IRepository>();
Assert.NotEmpty(repo.Data);
}

理论上,可以编写反射(reflect)接口(interface)成员并为每个成员设置返回值的自动化代码,但在我看来,这永远不应该成为 AutoFixture.AutoMoq 的默认行为。

关于moq - AutoFixture.AutoMoq : set value to read only property,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15338823/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com