我正在使用xUnit 2
和AutoFixture
为.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
,这是我过去从未需要的。我可以自己轻松地在测试中更新模拟程序,我打算根据需要进行工作,但是我很好奇为什么以前正常工作的某些东西不再有效:我一直在使用错误的代码吗?只是偶然获得了成功?
答案 0 :(得分:1)
Autofixture使用循环分配默认值,因此在3个模拟中失败。这是“自动修复问题”页面上的说明。
当AutoFixture尝试自动将属性分配给 新创建的Mock对象。自动生成的DefaultValue属性 不太适合,因此Moq失败了。对于枚举值,自动修复 使用循环策略,这说明了为什么2 模拟可以正常工作,而3个模拟开始将其崩溃。
您可以阅读full comment here