我的测试失败了,因为以下消息:
The sourceName specified on a TestCaseSourceAttribute must refer to a static field, property or method.这是我的守则:
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);
}我只使用静态测试用例方法,但现在我需要访问非静态数据,如变量Qv_ges_Quer:Qv_ges_Quer.IL.Value、Qv_ges_Quer.FL.Value.所以我去掉了static
问题:
如何使用非静态测试箱?
通过调试,我还注意到它一开始没有进入SetUp。
这是我想要重新组织的旧代码,也许您知道另一种/更好的方法,然后是上面的方式:
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);
}发布于 2016-09-07 15:55:16
根据设计,TestCaseSourceAttribute使用的方法、属性或字段必须是静态的。这是为了避免在加载测试时实例化夹具类的需要。您的夹具只有在我们启动运行时才被实例化--在GUI的情况下,每次我们启动运行--并且它的生存期仅限于运行该夹具所需的时间。
在您的示例中,您似乎已经发现可以使用静态方法。这是最好的,如果可能的话。
这里使用实例方法的唯一方法是使用构造函数TestCaseSourceAttribute(Type sourceType),其中sourceType实现IEnumerable并直接返回测试用例数据。如果使用此方法,我建议使用与TestFixture不同的类。这不是绝对必要的。如果使用同一个类,则将在加载时和运行时创建不同的实例,这些实例之间没有任何连接。许多开发人员最终对此感到困惑,并试图在加载时留下状态,供测试使用。那不管用。
发布于 2019-02-01 15:53:19
♀️僵尸的回应,但迟到总比没有好。
实现这一目标的另一种方法是让测试用例数据源返回一个函数对象,该对象接受所需的非静态成员作为其参数。然后,您的测试调用它来创建希望NUnit传递给您的数据。
在你的例子中,这看起来像是:
private static IEnumerable<TestCaseData> GetTestDataA()
{
yield return new TestCaseData(72.5, new Func<Qv_ges, double>( qvGesQuer => qvGesQuer.FL.Value ), MAX_DELTA);
yield return new TestCaseData(169.17, new Func<Qv_ges, double>( qvGesQuer => qvGesQuer.RL.Value ), MAX_DELTA);
yield return new TestCaseData(241.67, new Func<Qv_ges, double>( qvGesQuer => qvGesQuer.NL.Value ), MAX_DELTA);
yield return new TestCaseData(314.17, new Func<Qv_ges, double>( qvGesQuer => qvGesQuer.IL.Value ), MAX_DELTA);
}
[TestCaseSource( nameof(GetTestDataA) )]
public void MethodA( double expected, Func<Qv_ges, double> getValue, double latitude)
{
Assert.AreEqual( expected, getValue( Qv_ges_Quer ), latitude );
}如果需要多个参数,请将它们添加到函子和lambda的参数中,或者考虑传入this。如果需要多个返回值,则使函数对象返回一个元组:
new Func<Qv_ges, (double, double)>( qvGesQuer => (qvGesQuer.RL.Value, qvGesQuer.IL.Value) )另一种方法是将nameof()字符串作为测试参数传递,并使用反射获取这些参数的值。
https://stackoverflow.com/questions/39365550
复制相似问题