按预期发现具有以下测试的测试类:
[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包版本:
AutoFixture 3.30.8
AutoFixture.Xunit2 3.30.8
AutoFixture.AutoNSubstitute 3.30.8
xunit 2.0.0
xunit.runner.visualstudio 2.0.0
xunit.runner.console 2.0.0
NSubstitute 1.8.2.0
我正在使用Visual Studio 2013 Update 4并以.NET 4.5.1框架为目标
更新:根据推荐,我尝试了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也是如此。对这种行为有什么想法吗?是预期的吗?
答案 0 :(得分:2)
xUnit visual studio runner和TestDriven.Net runner都会导致这些奇怪的问题,因为AutoNSubstituteDataAttribute
类和构造函数是internal
。将这些更改为public
可解决所有问题。如果忽略该属性,我会发出如下错误:System.InvalidOperationException : No data found for ...
这并不能解释为什么下游测试会受到来自完全不同测试的违规AutoNSubstituteData
属性的影响。在这种情况下,单位测试跑步者似乎应该更加强大。
为了完整起见,这里是AutoNSubstituteDataAttribute
的工作实施:
public class AutoNSubstituteDataAttribute : AutoDataAttribute
{
public AutoNSubstituteDataAttribute()
: base(new Fixture().Customize(new AutoNSubstituteCustomization()))
{
}
}