如何确定 TestCaseSource 值来自哪个?

How to determine from which TestCaseSource value is coming from?

我正在使用多个 TestCaseSource 属性。是否可以确定哪个值来自哪个来源?

代码示例:

[TestCaseSource(CountryListA)]
[TestCaseSource(CountryListB)]
public void SomeTest(Country country){
   ...tests on country...
// access the source (either CountryListA or CountryListB)
}

访问源有多种原因,例如我需要检查该列表中的国家/地区是否是唯一的,或者如果出现问题我想记录测试失败的国家/地区。

简短回答:不。事实上,NUnit 的设计就是为了让这成为不可能。测试基本上不应该知道他们的论据来自何处或由谁提供。这在某些高级测试生成场景以及 [Theory] 测试中很重要。

解决此问题的一般方法是采取措施确保您的测试具有唯一名称。任何重复项,无论是在同一个列表中还是在两个列表之间,都无法准确确定问题出在哪个来源。

关键问题是显然重复测试是否是真正的重复。您不会知道,除非每个返回参数的类型以允许您确定确切大小写的方式覆盖 ToString()。例如,如果 Country 是没有 ToString 覆盖的 class,则测试的每个实例都将被命名为类似 SomeTest(<Country>) 的名称。 OTOH,如果 Countryenum 或者它的 ToString() 以独特的方式被覆盖,这将不是问题。

对于您的情况,即使显示名称相同,也有一种相对简单的方法可以为您的测试提供唯一的全名

  1. 将所有测试放在一个抽象基础中class。

  2. 从该底座导出两个不同的固定装置。

  3. 在其中一个灯具中使用 CountryListA,在另一个灯具中使用 CountryListB

也就是说,在我看来更好的方法是保持当前结构并使测试用例更易于识别。