C# NUnit:如何从非静态方法传递TestCaseData?
我的测试失败是因为: 消息:TestCaseSourceAttribute上指定的sourceName必须引用静态字段、属性或方法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
这是我的代码:
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);
}