首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AutoFixture.AutoMoq:将值设置为只读属性

AutoFixture.AutoMoq:将值设置为只读属性
EN

Stack Overflow用户
提问于 2013-03-11 20:40:47
回答 1查看 3.8K关注 0票数 6

我在AutoMoq中使用AutoFixture。我尝试创建一个类的伪实例,它有一个带有getter但没有setter的属性。我希望AutoFixture对模拟进行配置,这样即使没有设置器,它也会返回给定值。

我的代码是这样的:

代码语言:javascript
复制
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“方法在这种情况下不起作用,因为auto fixture说数据没有任何setter,这就是为什么我必须在之后通过直接调用mock来设置值。

有没有办法让auto fixture自己做这件事,这样我就不需要最后一行代码了?

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

代码语言:javascript
复制
var data = new List<Data>() { new Data() };
var userManager = fixture.CreateAnonymous<IRepository>();
Mock.Get(userManager).Setup(x => x.Data).Returns(data)

尽管如此,如果对伪实例有一个with方法,那就更好了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-13 14:55:49

AutoFixture.AutoMoq doesn't set up your Test Doubles为您服务。

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

代码语言:javascript
复制
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;
        });
    }
}

这样,下面的测试就通过了:

代码语言:javascript
复制
[Fact]
public void AutoProperty()
{
    var fixture = new Fixture().Customize(new RepositoryCustomization());
    var repo = fixture.Create<IRepository>();
    Assert.NotEmpty(repo.Data);
}

从理论上讲,可以编写自动代码来反映接口的成员并为每个成员设置返回值,但在AutoFixture.AutoMoq中,这永远不应该是默认行为。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15338823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档