在参数化测试中无法访问 NUnit 测试属性

j4n*_*4nw 2 c# nunit nunit-3.0

最初是在使用TestCaseSource和自定义派生property属性时遇到的。这是一个精炼的例子:

[TestFixture]
public class SomeTestFixture
{
    [Test, Property("SomeProperty", "foo")]
    public void RegularTest()
    {
    }

    [Test, Property("SomeProperty", "foo"), TestCase(0)]
    public void ParametrizedTest(int x)
    {
    }

    [TearDown]
    public void TearDown()
    {
        var properties = TestContext.CurrentContext.Test.Properties;
    }
}
Run Code Online (Sandbox Code Playgroud)

properties在 RegularTest 后拆除时将有 "SomeProperty": "foo",但在 ParametrizedTest 后它们将是空的。为什么会出现这种情况?除了使用反射之外,我还能如何解决这个问题?

Cha*_*lie 5

NUnit 的一个功能是,参数化测试上设置的属性适用于包含各个测试用例的套件。因此,您不应该以这种方式应用属性,除非您希望它们成为套件的属性,而不是测试用例的属性。

当然,这可能是一个设计缺陷。至少,它会让用户感到困惑。

如果您指定测试用例,则TestCaseAttribute无法添加新属性,尽管您可以指定一些众所周知的属性(例如描述)。解决方法是使用TestCaseSourceAttribute来指定案例并TestCaseData为每个案例提供单独的实例。该类TestCaseData确实允许您为每种情况设置属性。

诚然,这不是很方便,但它是一种解决方法。