2

如果我编写一个参数化的 NUnit 测试,使用类似[TestCaseSource]or的东西[ValueSource],NUnit 会将参数直接传递给我的测试方法。但是有没有其他方法可以访问这些参数,例如 fromSetUp或从辅助方法(无需显式地将参数值传递给该辅助方法)?

例如,假设我有三种不同的情况(可能是“上升利率”、“下降利率”和“恒定利率”)。我正在为特定计算编写测试,一些测试在所有三种情况下都会有相同的行为;三个中的两个(我将为另一个场景编写第二个测试);其他人将对每种情况进行单独的测试。参数化测试似乎是对此建模的好方法;我可以为每个场景编写一个策略对象,并根据每个测试应该应用于哪些场景来参数化测试。

我可以做这样的事情:

public IEnumerable<RateStrategy> AllScenarios {
    get {
        yield return new RisingRatesStrategy();
        yield return new FallingRatesStrategy();
        yield return new ConstantRatesStrategy();
    }
}
[TestCaseSource("AllScenarios")]
public void SomethingThatIsTheSameInAllScenarios(RateStrategy scenario) {
    InitializeScenario(scenario);
    ... arrange ...
    ... act ...
    ... assert ...
}

这样做的缺点是我需要记住InitializeScenario每次测试都要调用。这很容易搞砸,而且它也使测试更难阅读——除了确切说明该测试适用于哪些场景的属性之外,我还需要一行额外的代码来混淆我的测试,说哦是的,有情景。

还有其他方法可以访问测试参数吗?是否有一个类似于 on 的静态属性,TestContext可以让我从我的SetUp方法中访问测试的参数,这样我就可以使我的测试更具声明性(基于约定)并且更少重复?

(TestContext看起来很有希望,但它只告诉我测试的名称以及它是通过还是失败。测试的参数在那里,但只是作为显示字符串的一部分,而不是实际对象;我无法获取策略对象和开始调用它的方法。)

4

0 回答 0