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

标签 c# unit-testing junit nunit nunit-3.0

我的测试因以下消息而失败:

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.ValueQv_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);
}

最佳答案

🧟‍♀️ 僵尸 react ,但迟到总比不到好。 🧟

实现此目的的另一种方法是让您的测试用例数据源返回一个函数对象,该函数对象接受您需要的非静态成员作为其参数。然后您的测试调用它来创建您希望 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() 字符串作为测试参数,并使用反射来获取这些参数的值。

关于c# - NUnit:如何从非静态方法传递 TestCaseData?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39365550/

相关文章:

c# - 如何在 ASP.NET 身份框架中刷新当前经过身份验证的用户的角色更改成员身份?

c# - 如何转换为 C# - 将 C 中的结构传递给函数?

unit-testing - 带有驼峰大小写或下划线的 PHPUnit 测试类

java - java异常的catch block 中是否会捕获断言错误?

java - 使用 Apache Ant 构建成功但未运行 junit 文件

unit-testing - 如何使用 Mockito 解除异常异常?

c# - 如何为一组对象生成独立于顺序的唯一哈希

c# - 执行不返回任何结果的存储过程时抛出错误

unit-testing - 没有 Selenium 的yii Controller Action 单元测试

android - 如何测试依赖于Android插件的本地Gradle插件?