如何调用具有多个参数的测试方法(NUnit)

B0r*_*0r1 3 c# nunit testcase testcasesource

我的测试方法如下所示:

public static List<Something> Generator() {
return A.GenerateObjects();
}

[Test, TestCaseSource(nameof(Generator))]
    public void DoSomething(Something abc) {/*do something*/}
Run Code Online (Sandbox Code Playgroud)

该代码运行良好,并为列表中的每个对象生成一个单元案例。

我想在方法中包含另一个参数,例如:

public void DoSomething(Something abc, string def)
Run Code Online (Sandbox Code Playgroud)

我已经尝试过使用这些行,但它不起作用:

public static object[] Case =
    {
        new object[]
        {
            A.GenerateObjects(),
            someStrings
        }
    };
Run Code Online (Sandbox Code Playgroud)

也许使用循环函数迭代列表而不是直接调用方法(GenerateObjects())?我也不明白 Nunit 如何仅使用 TestCaseSource(nameof(Generator)) 直接识别列表中的对象

提前致谢!

Ada*_*m G 5

您可以像这样返回 TestCaseData 的 IEnumerable:

    public static IEnumerable<TestCaseData> Generator()
    {
        yield return new TestCaseData(new Something { SomeValue = "Hi" }, "Foo").SetName("FirstTest");
        yield return new TestCaseData(new Something { SomeValue = "Bye" }, "Bar").SetName("SecondTest");
    }

    [Test]
    [TestCaseSource(nameof(Generator))]
    public void DoSomething(Something abc, string def)
    {
        Console.WriteLine($"{abc.SomeValue},{def}");
    }
Run Code Online (Sandbox Code Playgroud)

SetName 是可选的,只是当您想要一个比它所组成的默认名称更有意义的名称时。

我也不明白 Nunit 如何仅使用 TestCaseSource(nameof(Generator)) 直接识别列表中的对象

Nunit 注意到测试方法上的 TestCaseSource 属性,然后使用反射来调用“Generator”方法。(Nameof 只是糖,编译器在构建它时用实际名称替换它)。返回的每个 TestCaseData 对象都是另一个测试用例。在我上面的示例中,测试将运行两次。FirstTest 将有一个 Something 实例,其中 SomeValue 设置为 Hi 和 Foo 的 def 字符串。SecondTest 将有一个 Something 实例,其中 SomeValue 设置为 Bye 和 Bar 的 def 字符串。