将 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!
}
MyBrokenTest
和 MyWorkingTestThatIsNowBroken
均在 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()))
{
}
}
按预期发现具有以下测试的测试 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!
}
MyBrokenTest
和 MyWorkingTestThatIsNowBroken
均在 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()))
{
}
}