将 AutoFixture 与 NSubstitute 自动数据属性一起使用时缺少测试

Test missing when using AutoFixture with NSubstitute auto data attribute

按预期发现具有以下测试的测试 class:

[Theory]
[AutoData]
public void MyDiscoveredTest() { }

但是,缺少以下测试:

[Theory]
[AutoNSubstituteData]
public void MyMissingTest() { }

有趣的是,如果我把 MyDiscoveredTest 放在 MyMissingTest 之后,那么 MyDiscoveredTest 现在也不见了。我已经尝试了 xUnit visual studio runner 和 xUnit console runner,结果相同。

我的 AutoNSubstituteData 属性定义在这里:

internal class AutoNSubstituteDataAttribute : AutoDataAttribute
{
    internal AutoNSubstituteDataAttribute()
        : base(new Fixture().Customize(new AutoNSubstituteCustomization()))
    {
    }
}

一个相关问题:由于上面的 AutoNSubstituteDataAttribute 似乎是一个相当常见的属性,我想知道为什么它不包含在 AutoFixture.AutoNSubstitute 中。 InlineAutoNSubstituteDataAttribute 同样有用。我应该为这些提交拉取请求吗?

使用的 Nuget 包版本:
自动夹具 3.30.8
AutoFixture.Xunit2 3.30.8
AutoFixture.AutoNSubstitute 3.30.8
xunit 2.0.0
xunit.runner.visualstudio2.0.0
xunit.runner.console2.0.0
NSubstitute 1.8.2.0

我正在使用 Visual Studio 2013 Update 4 并针对 .NET 4.5.1 Framework

更新: 按照建议,我尝试了 TestDriven.NET-3.9.2897 Beta 2。缺少的测试现在可以运行,但似乎仍然存在一些错误。新示例:

[Theory]
[AutoData]
public void MyWorkingTest(string s)
{
    Assert.NotNull(s); // Pass
}

[Theory]
[AutoNSubstituteData]
public void MyBrokenTest(string s)
{
    Assert.NotNull(s); // Fail
}

[Theory]
[AutoData]
public void MyWorkingTestThatIsNowBroken(string s)
{
    Assert.NotNull(s); // Fail even though identical to MyWorkingTest above!
}

MyBrokenTestMyWorkingTestThatIsNowBroken 均在 Assert.NotNull 处失败,而 MyWorkingTest 通过,即使它与 MyWorkingTestThatIsNowBroken 相同。因此,不仅 AutoNSubstituteData 属性无法正常工作,而且会导致下游测试出现异常!

Update2:AutoNSubstituteDataAttribute 的定义更改为 public 而不是 internal 可以修复所有问题。 xunit runner 现在像 TestDriven.Net 一样发现并通过所有测试。对这种行为有任何想法吗?是否符合预期?

xUnit visual studio runner 和 TestDriven.Net runner 都导致了这些奇怪的问题,因为 AutoNSubstituteDataAttribute class 和构造函数是 internal。将这些更改为 public 可解决所有问题。如果该属性被忽略,我会出现这样的错误:System.InvalidOperationException : No data found for ...

这并不能解释为什么下游测试会受到来自完全不同测试的违规 AutoNSubstituteData 属性的影响。在这种情况下,单元测试运行器似乎应该更健壮。

为完整起见,这里是 AutoNSubstituteDataAttribute:
的工作实现

public class AutoNSubstituteDataAttribute : AutoDataAttribute
{
    public AutoNSubstituteDataAttribute()
        : base(new Fixture().Customize(new AutoNSubstituteCustomization()))
    {
    }
}