【问题标题】:AutoFixture returning nulls for all values on a Moq'ed interfaceAutoFixture 为 Moq 接口上的所有值返回空值
【发布时间】:2018-03-24 07:13:10
【问题描述】:

我正在使用 AutoFixture 来填充一个相当大的接口对象,但我得到了每个属性的空值(或默认值)。我都试过了:

var fixture = new Fixture();
var input = fixture.Create<Mock<ICustomer>>();

还有:

var fixture = new Fixture();
fixture.Register(() => Mock.Of<ICustomer>());
var input = fixture.Create<ICustomer>();

在这两种情况下,生成的ICustomer 上的任何属性都不会被填充。我猜我漏掉了一些明显的东西?

【问题讨论】:

  • 您注册了模拟ICustomer 的新实例。因此,您没有使用生成“虚拟”值的 AutoFixture 的好处。对于模拟实例,您仍然需要提供一些默认值
  • 致那些渴望以重复的形式结束此问题的人:重新考虑。正如公认的答案所暗示的那样,它几乎不是重复的。

标签: c# unit-testing moq autofixture


【解决方案1】:

您可以为此使用AutoFixture.AutoMoq 包:

[Fact]
public void HowToCreateAnAutoConfiguredMoq()
{
    var fixture = new Fixture().Customize(new AutoConfiguredMoqCustomization());
    var c = fixture.Create<ICustomer>();
    Assert.NotEqual(default(string), c.Name);
}

就个人而言,我不是AutoConfiguredMoqCustomization 的忠实粉丝,因为我认为它使测试过于隐晦。我相信explicit is better than implicit,所以我通常更喜欢使用AutoMoqCustomization,并将其与显式配置那些对相关测试很重要的行为相结合。

另见How to configure AutoMoq to set up all properties

【讨论】:

  • 可爱!谢谢!我同意这些东西的隐含性质,但我正在处理 100 多个属性,所以它处于“无法管理”的地步
  • 感谢您明确提及显式测试配置的价值
猜你喜欢
  • 2021-06-28
  • 1970-01-01
  • 1970-01-01
  • 2017-01-25
  • 2018-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多