如果我使用[TestCaseSource]
或[ValueSource]
之类的东西编写参数化NUnit测试,NUnit会将参数直接传递给我的测试方法。但是有没有其他方法来访问这些参数,例如来自SetUp
,或来自辅助方法(无需将参数值显式传递给该辅助方法)?
例如,假设我有三种不同的情景(可能是“上升率”,“下降率”和“恒定利率”)。我正在为特定的计算编写测试,并且一些测试在所有三种情况下都会有相同的行为;三个中的两个中的其他人(我将为另一个场景编写第二个测试);其他人将针对每个场景进行单独测试。参数化测试似乎是对此进行建模的好方法;我可以为每个场景编写一个策略对象,并根据每个测试应该应用于哪些场景来参数化测试。
我可以这样做:
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
。这很容易搞砸,它也使得测试更难阅读 - 除了确切地说明这个测试适用于哪些场景的属性之外,我还需要额外的一行代码使我的测试变得混乱,说是哦是啊,有场景。
还有其他方法可以访问测试参数吗?是否存在静态属性,类似于TestContext
上的属性,可以让我从我的SetUp
方法访问测试参数,这样我就可以使我的测试更具说明性(基于约定)和重复性较低?
(TestContext
看起来很有前途,但它只告诉我测试的名称以及它是否通过。测试的参数是那里的,但只作为显示字符串的一部分,而不是作为实际对象;我无法获取策略对象并开始在其上调用方法。)