【发布时间】:2019-11-21 12:36:25
【问题描述】:
我正在使用 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,因为我过去从来不需要这样做。我可以很容易地在测试中自己更新模拟,并且我打算在我需要它工作的时候使用它,但我很好奇为什么以前可以正常工作的东西现在不再起作用了:我一直都用错了吗?只是碰巧成功了?
【问题讨论】:
标签: c# unit-testing moq xunit autofixture