将AutoFixture与NSubstitute自动数据属性

时间:2015-07-07 21:50:42

标签: xunit autofixture nsubstitute

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

[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!
}

MyBrokenTestMyWorkingTestThatIsNowBroken都在Assert.NotNull失败,而MyWorkingTest即使与MyWorkingTestThatIsNowBroken相同。因此AutoNSubstituteData属性不仅无法正常工作,而且导致下游测试行为异常!

Update2:AutoNSubstituteDataAttribute的定义更改为public而不是internal可修复所有内容。 xunit runner现在发现并传递所有测试,TestDriven.Net也是如此。对这种行为有什么想法吗?是预期的吗?

1 个答案:

答案 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()))
    {
    }
}