在测试中使用两个以上的模拟时发生异常

时间:2019-07-11 18:14:36

标签: c# unit-testing moq xunit autofixture

我正在使用xUnit 2AutoFixture为.Net Core 2.2项目编写测试。我需要三个Mocks才能满足测试中的系统的要求,以前AutoFixture没问题。但是现在,当我在测试签名中添加两个以上的模拟时,就会出现异常。

[Theory]
[AutoData]
public void ContrivedTest(
   Mock<IDependencyOne> mockDependencyOne,
   Mock<IDependencyTwo> mockDependencyTwo)
{
    Assert.True(true);
}

将按预期工作,但是:

[Theory]
[AutoData]
public void ContrivedTest(
   Mock<IDependencyOne> mockDependencyOne,
   Mock<IDependencyTwo> mockDependencyTwo,
   Mock<IDependencyThree> mockDependencyThree)
{
    Assert.True(true);
}

引发以下异常:

  

---- System.Reflection.TargetInvocationException:调用的目标引发了异常。

     

-------- System.ArgumentOutOfRangeException:指定的参数超出有效值范围。参数名称:值

最近在AutoFixture Github上问了这个问题(几乎是逐字),但提供了答案:

  

仅安装AutoFixture.AutoMoq软件包时,AutoData和InlineAutoData不会意识到Moq。相反,您应该创建从默认属性派生的自己的数据属性,在Moq支持下自定义夹具并使用它们

对我来说没有意义。为什么两个模拟应该起作用,而三个却不能?创建自己的数据属性有何帮助?我应该如何通过Moq支持自定义固定装置?

值得注意的是,我没有使用过AutoMoq,这是我过去从未需要的。我可以自己轻松地在测试中更新模拟程序,我打算根据需要进行工作,但是我很好奇为什么以前正常工作的某些东西不再有效:我一直在使用错误的代码吗?只是偶然获得了成功?

1 个答案:

答案 0 :(得分:1)

Autofixture使用循环分配默认值,因此在3个模拟中失败。这是“自动修复问题”页面上的说明。

  

当AutoFixture尝试自动将属性分配给   新创建的Mock对象。自动生成的DefaultValue属性   不太适合,因此Moq失败了。对于枚举值,自动修复   使用循环策略,这说明了为什么2   模拟可以正常工作,而3个模拟开始将其崩溃。

您可以阅读full comment here