繁体   English   中英

从TestCaseSource(NUnit)中的TestFixture访问值

[英]Accessing value from TestFixture in TestCaseSource (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();
        }
    }
}

TestCaseSource生成测试时(使用类或方法,对我来说无关紧要),是否有办法以某种方式获取当前的TestFixture值(在这种情况下为1020 )? 我知道我可以通过派生类或复制方法来解决此问题,但是我希望有一个干净的解决方案(在计划B排队之前)。

抱歉地说这行不通。 :-(

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

这是测试发现时的顺序:

  1. NUnit标识您的测试治具,并注意将其(以后)实例化两次的事实。 它记录了用于命名目的的参数。 这给了我们两个夹具,每个夹具都需要进行测试。

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

稍后(几秒钟,几分钟,几年?),NUnit执行您的测试。 当它到达所讨论的灯具时,将其实例化两次,一次使用10,一次使用20。运行先前确定的测试用例。

如您所见,在发现测试时,甚至没有实例化测试夹具。 当然,NUnit“知道”这些参数,并且理论上可以提供某种替代工具,但是这种替代工具不存在-创建起来将非常复杂,因为通常它可能涉及模拟夹具方法的任意执行。

将参数的值存储在构造函数中并从测试中访问它是解决此问题的“标准”方法。 如果您要执行的某项操作无法使用该技术,则最好将其拼写清楚,以便我们查看是否有解决方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM