【问题标题】:Test missing when using AutoFixture with NSubstitute auto data attribute使用带有 NSubstitute 自动数据属性的 AutoFixture 时缺少测试
【发布时间】:2015-07-07 21:50:42
【问题描述】:

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

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

但是,缺少以下测试:

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

有趣的是,如果我把MyDiscoveredTest 放在 MyMissingTest 之后,那么MyDiscoveredTest 现在也不见了。我已经尝试了 xUnit Visual Studio 运行程序和 xUnit 控制台运行程序,结果相同。

我的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.visualstudio 2.0.0
xunit.runner.console 2.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!
}

MyBrokenTestMyWorkingTestThatIsNowBrokenAssert.NotNull 处失败,而 MyWorkingTest 则通过,即使它与 MyWorkingTestThatIsNowBroken 相同。因此,AutoNSubstituteData 属性不仅不能正常工作,还会导致下游测试行为不端!

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

【问题讨论】:

  • 这看起来像一个测试运行错误。您可以尝试使用TestDriven.Net 运行测试吗?
  • 虽然Inline/AutoNSubstituteData 看起来很常见,但自动模拟 Glue 库都没有引用 AutoFixture.Xunit,因此无法执行拉取请求。 – 即使自动模拟 Glue 库引用 AutoFixture.Xunit,该属性也没有多大意义,因为在大多数情况下,您最终会在 AutoDataAttribute 派生类型中组合多个 AutoFixture 自定义。
  • @NikosBaxevanis 感谢您的解释。 Inline/AutoNSubstituteData 的实现非常简单,所以我自己实现也没什么大不了的。顺便说一句,我在尝试 TestDriven.Net 后更新了问题;似乎有些东西仍然无法正常工作。会不会是 xUnit 的问题?
  • 以上所有测试都在我的机器上通过以下 NuGet 包:AutoFixture.Xunit2AutoFixture.AutoNSubstitutexunit。你能尝试一个空的类库项目吗?
  • 很公平。但是,如果该属性被忽略,我预计会出现这样的错误:System.InvalidOperationException : No data found for .. 此外,没有解释为什么下游测试会受到来自完全不同测试的有问题的AutoNSubstituteData 属性的影响。在这种情况下,跑步者似乎应该更健壮一些。感谢您的回复!

标签: xunit autofixture nsubstitute


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-15
    • 2023-03-24
    • 1970-01-01
    相关资源
    最近更新 更多