从TestCaseSource(NUnit)中的TestFixture访问值

时间:2017-05-22 10:33:41

标签: c# unit-testing nunit

让我们进行此设置:

[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值(在这种情况下为20TestCaseSource)(使用类或方法,对我来说不重要)?我知道我可以通过推导类或复制方法来解决这个问题,但我希望有一个干净的解决方案(排队计划B之前)。

1 个答案:

答案 0 :(得分:1)

很抱歉,说这不起作用。 : - (

首先,让我们清楚一点,你的嵌套testcasesource类与NUnit没有特殊的地位,因为它是嵌套的。它独立于测试夹具类进行实例化,并且与未嵌套时的工作方式完全相同。

以下是测试发现时的一系列事项:

  1. NUnit识别您的测试夹具,并注意到它(稍后)将被实例化两次这一事实。它注意到了命名目的的论点。这给了我们两个装置,每个装置都需要发现它的测试。

  2. NUnit查看每个灯具中的所有方法以查找测试。当谈到TestCaseSourceAttribute时,它实例化源类并使用它的IEnumerable接口来获取测试用例。

  3. 后来(秒,分钟,年?)NUnit执行你的测试。当它到达有问题的灯具时,它会实例化两次,一次使用10次,一次使用20次。测试用例之前已识别

    如您所见,在发现测试时甚至没有实例化测试夹具。当然,NUnit&#34;知道&#34;参数和理论上可以提供某种替代设施,但不存在这样的设施 - 而且创建起来非常复杂,因为一般来说它可能涉及模拟固定装置方法的任意执行。

    在构造函数中存储参数的值并从测试中访问它是&#34;标准&#34;解决这个问题的方法。如果您想要做的事情不能使用该技术,最好更清楚地拼写出来,以便我们看看是否有解决方法。