1

我的测试方法如下所示:

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

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

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

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

public void DoSomething(Something abc, string def)

我已经用这些线试过了,但没有用:

public static object[] Case =
    {
        new object[]
        {
            A.GenerateObjects(),
            someStrings
        }
    };

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

提前致谢!

4

2 回答 2

2

您可以像这样返回 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}");
    }

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

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

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

于 2018-05-04T15:08:16.727 回答
0

您的初始测试采用 type 的单个参数Something。显然,A.GenerateObjects()返回这些对象的某种 IEnumerable - 你没有显示细节。因为测试是一种单参数方法,所以它有效。NUnit 为单参数方法提供了一种特殊情况,它非常宽容,将接受对象数组或所需类型的数组,并为您自己生成测试用例。

但是,对于多个参数,您可以自己从方法中返回一组测试用例。您可能知道,C# 中方法的参数采用object[]包含参数的形式,例如new object[] { aSomething, "astring" }.

假设您有需要与每个对象关联的特定字符串,则由您来建立该关联。如何做到这一点取决于您尝试做的事情的细节。

您是否有一个字符串列表,您想将其与对象列表一对一关联?在这种情况下,停止使用[TestCaseSource]并在测试方法的每个参数上使用[ValueSource][Values]。应用[Sequential]该方法使 NUnit 一对一匹配对象和字符串。这是一个例子......

[Test, Sequential]
public void DoSomething(
    [ValueSource(typeof(A), nameof(GetObjects)] Something abc,
    [Values("string1", "string2", "string3")] string def)
{/*do something*/}

这只是一种方法。我不得不做一堆猜测你有什么数据是现成的,你想做什么。如果这种方法对您不起作用,请填写一些空白,我将编辑答案。

于 2018-05-04T15:38:18.930 回答