AutoFixture、NSubstitute、带 ClassData 的 xUnit

问题描述 投票:0回答:1

我正在将 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 产生了两次?

xunit nsubstitute autofixture
1个回答
0
投票

回答提问:【Theory】是xUnit属性。根据他们的文档: “如果数据源包含多行,则测试方法会执行多次(每个数据行一次)。”

上面的用法中只有一行数据:

[Theory]
[AutoNSubstituteClassData(typeof(TestClass1))]

要使测试运行两次:

[Theory]
[AutoNSubstituteClassData(typeof(TestClass1))]
[AutoNSubstituteClassData(typeof(TestClass1))]

在这种情况下,实现 GetEnumerator() 只需要产生一次。

© www.soinside.com 2019 - 2024. All rights reserved.