首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NUnit:如何从非静态方法传递TestCaseData?

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

Stack Overflow用户
提问于 2016-09-07 09:01:37
回答 2查看 9.9K关注 0票数 17

我的测试失败了,因为以下消息:

代码语言:javascript
复制
The sourceName specified on a TestCaseSourceAttribute must refer to a static field, property or method.

这是我的守则:

代码语言:javascript
复制
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_QuerQv_ges_Quer.IL.ValueQv_ges_Quer.FL.Value.所以我去掉了static

问题:

如何使用非静态测试箱?

通过调试,我还注意到它一开始没有进入SetUp。

这是我想要重新组织的旧代码,也许您知道另一种/更好的方法,然后是上面的方式:

代码语言:javascript
复制
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);
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-07 15:55:16

根据设计,TestCaseSourceAttribute使用的方法、属性或字段必须是静态的。这是为了避免在加载测试时实例化夹具类的需要。您的夹具只有在我们启动运行时才被实例化--在GUI的情况下,每次我们启动运行--并且它的生存期仅限于运行该夹具所需的时间。

在您的示例中,您似乎已经发现可以使用静态方法。这是最好的,如果可能的话。

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

票数 10
EN

Stack Overflow用户

发布于 2019-02-01 15:53:19

‍♀️僵尸的回应,但迟到总比没有好。

实现这一目标的另一种方法是让测试用例数据源返回一个函数对象,该对象接受所需的非静态成员作为其参数。然后,您的测试调用它来创建希望NUnit传递给您的数据。

在你的例子中,这看起来像是:

代码语言:javascript
复制
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。如果需要多个返回值,则使函数对象返回一个元组:

代码语言:javascript
复制
new Func<Qv_ges, (double, double)>( qvGesQuer => (qvGesQuer.RL.Value, qvGesQuer.IL.Value) )

另一种方法是将nameof()字符串作为测试参数传递,并使用反射获取这些参数的值。

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39365550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档