让我们进行此设置:
[TestFixture(10)]
[TestFixture(20)]
public class TestClass
{
int I;
public TestClass(int i)
{
I = i;
}
[TestCaseSource(typeof(TestSource))]
public void Test(string name)
{
TestContext.WriteLine(name);
}
class TestSource : IEnumerable<TestCaseData>
{
public IEnumerator<TestCaseData> GetEnumerator()
{
yield return new TestCaseData("AAA") { TestName = $"Test" };
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
}
在TestFixture
中生成测试时,有没有办法以某种方式获取当前10
值(在这种情况下为20
或TestCaseSource
)(使用类或方法,对我来说不重要)?我知道我可以通过推导类或复制方法来解决这个问题,但我希望有一个干净的解决方案(排队计划B之前)。
答案 0 :(得分:1)
很抱歉,说这不起作用。 : - (
首先,让我们清楚一点,你的嵌套testcasesource类与NUnit没有特殊的地位,因为它是嵌套的。它独立于测试夹具类进行实例化,并且与未嵌套时的工作方式完全相同。
以下是测试发现时的一系列事项:
NUnit识别您的测试夹具,并注意到它(稍后)将被实例化两次这一事实。它注意到了命名目的的论点。这给了我们两个装置,每个装置都需要发现它的测试。
NUnit查看每个灯具中的所有方法以查找测试。当谈到TestCaseSourceAttribute时,它实例化源类并使用它的IEnumerable接口来获取测试用例。
后来(秒,分钟,年?)NUnit执行你的测试。当它到达有问题的灯具时,它会实例化两次,一次使用10次,一次使用20次。测试用例之前已识别。
如您所见,在发现测试时甚至没有实例化测试夹具。当然,NUnit&#34;知道&#34;参数和理论上可以提供某种替代设施,但不存在这样的设施 - 而且创建起来非常复杂,因为一般来说它可能涉及模拟固定装置方法的任意执行。
在构造函数中存储参数的值并从测试中访问它是&#34;标准&#34;解决这个问题的方法。如果您想要做的事情不能使用该技术,最好更清楚地拼写出来,以便我们看看是否有解决方法。