Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.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# NUnit:如何从非静态方法传递TestCaseData?_C#_Unit Testing_Junit_Nunit_Nunit 3.0 - Fatal编程技术网

C# NUnit:如何从非静态方法传递TestCaseData?

C# NUnit:如何从非静态方法传递TestCaseData?,c#,unit-testing,junit,nunit,nunit-3.0,C#,Unit Testing,Junit,Nunit,Nunit 3.0,我的测试失败是因为: 消息:TestCaseSourceAttribute上指定的sourceName必须引用静态字段、属性或方法 这是我的代码: const double MAX_DELTA = 0.01; Qv_ges qv_ges_NE; double Sum_Qv_ges_R_FL; Qv_ges Qv_ges_Quer; [SetUp] public void init() { qv_ges_NE = Din1946.Calc_Qv_ges_NE(205.7d); S

我的测试失败是因为: 消息:TestCaseSourceAttribute上指定的sourceName必须引用静态字段、属性或方法


这是我的代码:

const double MAX_DELTA = 0.01;
Qv_ges qv_ges_NE;
double Sum_Qv_ges_R_FL;
Qv_ges Qv_ges_Quer;

[SetUp]
public void init()
{
    qv_ges_NE = Din1946.Calc_Qv_ges_NE(205.7d);
    Sum_Qv_ges_R_FL = 15d + 15d + 15d + 15d + 15d + 10d + 10d + 10d + 10d + 10d + 10d + 10d;
    Qv_ges_Quer = Din1946.Calc_Qv_ges_Quer(qv_ges_NE, Sum_Qv_ges_R_FL);
}

public IEnumerable<TestCaseData> TestCases_A()
{
        yield return new TestCaseData(72.5, Qv_ges_Quer.FL.Value, MAX_DELTA);
        yield return new TestCaseData(169.17, Qv_ges_Quer.RL.Value, MAX_DELTA);
        yield return new TestCaseData(241.67, Qv_ges_Quer.NL.Value, MAX_DELTA);
        yield return new TestCaseData(314.17, Qv_ges_Quer.IL.Value, MAX_DELTA);
    }


    [TestCaseSource("TestCases_A")]
public void MethodA(double expected, double value, double latitude)
      { Assert.AreEqual(expected, value, latitude);}

根据设计,TestCaseSourceAttribute使用的方法、属性或字段必须是静态的。这是为了避免在加载测试时实例化fixture类。只有当我们开始运行时,您的设备才会被实例化——对于GUI来说,每次我们开始运行时,它的生命周期只有运行设备所需的时间


在您的情况下,您似乎已经发现可以使用静态方法。如果可能的话,那是最好的


这里使用实例方法的唯一方法是使用构造函数TestCaseSourceAttribute(类型sourceType),其中sourceType实现IEnumerable并直接返回测试用例数据。如果您使用这个,我建议您使用与TestFixture不同的类。这不是绝对必要的。如果使用同一个类,将在加载时和运行时创建不同的实例,它们之间没有任何连接。许多开发人员最终对此感到困惑,并试图在加载时留下状态供测试使用。那不行。

我必须承认,
Calc_Qv_ges_query()
是一种静态方法,所以我不能使用TestCaseSource访问对象,因为它的TestCaseSource是静态的?Sry,我不明白:/I我回答您的问题是因为您希望源数据方法是非静态的。那是不可能的。没有什么可以阻止测试方法成为实例方法。我们曾经有很多TestCaseSources,它们使用测试夹具的TestData属性来定位测试用例文件集。要把这个逻辑讲出来并不容易。这在NUnit2上基本上是正常的(除了为不打算在此会话中运行的测试调用了不必要的测试用例源),这是迁移到NUnit3的一个重大变化。最糟糕的是TestCaseSource调用派生类中重写的虚拟方法。对于这一点,我现在不知道该怎么办。另请参见我关于使用函子来完成此任务的回答。
public void MethodA(){
  Qv_ges qv_ges_NE = Din1946.Calc_Qv_ges_NE(205.7d);

  double Sum_Qv_ges_R_FL = 15d + 15d + 15d + 15d + 15d + 10d + 10d + 10d + 10d + 10d + 10d + 10d;
  Qv_ges Qv_ges_Quer = Din1946.Calc_Qv_ges_Quer(qv_ges_NE, Sum_Qv_ges_R_FL);

  Assert.AreEqual(72.5, Qv_ges_Quer.FL.Value, MAX_DELTA);
  Assert.AreEqual(169.17, Qv_ges_Quer.RL.Value, MAX_DELTA);
  Assert.AreEqual(241.67, Qv_ges_Quer.NL.Value, MAX_DELTA);
  Assert.AreEqual(314.17, Qv_ges_Quer.IL.Value, MAX_DELTA);
}