C#NUnit TestCaseSource传递参数

spa*_*rkr 12 c# nunit

我有以下方法生成一组测试用例!

public IEnumerable<ResultsOfCallMyMethod> PrepareTestCases(param1)
{
    foreach (string entry in entries)
    {
        yield return callMyMethod(param1);
    }
}
Run Code Online (Sandbox Code Playgroud)

如何将作为参数类型的param作为参数传递给我的PrepareTestCases()方法?

有没有办法做到以下几点:

[Test, Category("Integration"), TestCaseSource("PrepareTestCases", param1)]
public void TestRun(ResultsOfCallMyMethod testData)
{
    // do something!
}
Run Code Online (Sandbox Code Playgroud)

Joe*_*Joe 18

我已经在即将发布的最新版本的nunit中对此进行了更改(3.2).

https://github.com/nunit/nunit/blob/4f54fd7e86f659682e7a538dfe5abee0c33aa8b4/CHANGES.txt

  • TestCaseSourceAttribute现在可选地获取可以传递给source方法的参数数组

现在可以做这样的事情

[Test, Category("Integration"), TestCaseSource(typeof(MyDataSources),"PrepareTestCases", new object[] {param1})]
public void TestRun(ResultsOfCallMyMethod testData)
{
// do something!
}

private class MyDataSources
{
  public IEnumerable<ResultsOfCallMyMethod> PrepareTestCases(param1)
  {
    foreach (string entry in entries)
    {
        yield return callMyMethod(param1);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 没关系。我想通了: object[] 必须明确写入。顺便说一句,尽管有错误消息,也允许 nameof() (2认同)

Ale*_*iuk 10

如果查看TestCaseSourceAttribute doc,您将看到没有任何方法可以将参数传递给返回测试用例的方法.

生成测试用例的方法应该是无参数的.

因此,假设您要避免代码重复,并且需要重用相同的方法来生成一些测试用例列表,我建议您执行以下操作:

  1. 写这实际上生成测试用例集参数化方法:
    (PrepareTestCases()已经做那)

    public IEnumerable<ResultsOfCallMyMethod> PrepareTestCases(string param)
    {
        foreach (string entry in entries)
        {
            yield return CallMyMethod(param);
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 编写无参数包装器,调用测试用例生成器并在那里传递所需的参数:

    public IEnumerable<ResultsOfCallMyMethod> PrepareTestCases_Param1()
    {
        return PrepareTestCases("param1");
    }
    
    public IEnumerable<ResultsOfCallMyMethod> PrepareTestCases_Param2()
    {
        return PrepareTestCases("param2");
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 编写测试方法并将paremeterless包装器作为测试用例源传递:

    [TestCaseSource("PrepareTestCases_Param1")]
    public void TestRun1(ResultsOfCallMyMethod data)
    {
    }
    
    [TestCaseSource("PrepareTestCases_Param2")]
    public void TestRun2(ResultsOfCallMyMethod data)
    {
    }
    
    Run Code Online (Sandbox Code Playgroud)

  • 我认为PrepareTestCases_Param1等必须是静态的:“在TestCaseSourceAttribute上指定的sourceName必须引用静态字段,属性或方法。” (2认同)