我正在将 AutoFixture 与 NSubstitute 和 xUnit 结合使用。
我有以下属性实现:
public class AutoNSubstituteDataAttribute : AutoDataAttribute
{
public AutoNSubstituteDataAttribute()
: base(() => new Fixture().Customize(new AutoNSubstituteCustomization()))
{
}
}
public class AutoNSubstituteClassDataAttribute : CompositeDataAttribute
{
public AutoNSubstituteClassDataAttribute(Type @class)
: base(
new ClassDataAttribute(@class),
new AutoNSubstituteDataAttribute())
{
}
}
问题
当我尝试使用
[AutoNSubstituteClassData]
关于测试用例参数时,一切正常(即:所有参数都正常传递,包括自动模拟参数),但是 Theory
仅被调用一次,无论 Count()
IEnumerable
的
这是 Theory 的代码,以及 ClassData:
// Issue: called only once, despite of TestClass1 yields twice
[Theory]
[AutoNSubstituteClassData(typeof(TestClass1))]
public void AutoNSubstituteClassData_AutoFixture_Injects(string dummy,
string actualConcrete,
ITestInterface1 actualMock)
{
// Assert
dummy.Should().Be("dummy");
// 1) I do not blow the sample with AssertInjected, all is OK, actualConcrete is an expected auto generated string, and actualMock is an expected NSubstitute mock
// 2) If I comment out AssertInjected the issue is still there.
AssertInjected(actualConcrete, actualMock);
}
public class TestClass1 : IEnumerable<object[]>
{
public IEnumerator<object[]> GetEnumerator()
{
yield return new object[] {"dummy"};
yield return new object[] {"dummy"};
}
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}
问题
为什么
[Theory]
只运行一次,尽管 TestClass1 产生了两次?
回答提问:【Theory】是xUnit属性。根据他们的文档: “如果数据源包含多行,则测试方法会执行多次(每个数据行一次)。”
上面的用法中只有一行数据:
[Theory]
[AutoNSubstituteClassData(typeof(TestClass1))]
要使测试运行两次:
[Theory]
[AutoNSubstituteClassData(typeof(TestClass1))]
[AutoNSubstituteClassData(typeof(TestClass1))]
在这种情况下,实现 GetEnumerator() 只需要产生一次。