Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从TestCaseSource(NUnit)中的TestFixture访问值_C#_Unit Testing_Nunit - Fatal编程技术网

C# 从TestCaseSource(NUnit)中的TestFixture访问值

C# 从TestCaseSource(NUnit)中的TestFixture访问值,c#,unit-testing,nunit,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

让我们进行以下设置:

[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();
        }
    }
}
[测试夹具(10)]
[附件(20)]
公共类TestClass
{
int I;
公共测试类(INTI)
{
I=I;
}
[TestCaseSource(typeof(TestSource))]
公共无效测试(字符串名称)
{
TestContext.WriteLine(名称);
}
类TestSource:IEnumerable
{
公共IEnumerator GetEnumerator()
{
返回新的TestCaseData(“AAA”){TestName=$“Test”};
}
IEnumerator IEnumerable.GetEnumerator()
{
返回GetEnumerator();
}
}
}

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

很抱歉,这不可行:-(

首先,让我们明确一点,您的嵌套testcasesource类与NUnit没有特殊关系,因为它是嵌套的。它是独立于测试夹具类实例化的,并且工作方式与未嵌套时完全相同

以下是测试发现时的事情顺序:

  • NUnit标识您的测试设备,并注意到它将(稍后)实例化两次。它记录用于命名目的的参数。这给了我们两个设备,每个设备都需要发现其测试

  • NUnit查看每个装置中的所有方法以查找测试。当涉及到TestCaseSourceAttribute时,它实例化源类并使用其IEnumerable接口获取测试用例

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

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


    在构造函数中存储参数值并从测试中访问它是“标准”解决此问题的方法。如果您想做的某件事使用该技术不起作用,最好将其解释得更清楚,以便我们可以看到是否有解决方法。

    谢谢。我自己通过调试和测试找到了该序列。嵌套类只是一个示例。我将以某种方式拆分它并使用两个子类要获得相同的结果,而不是使用
    TestFixture
    。这可能很容易修复它。