如何使用多个参数调用测试方法(NUnit)

时间:2018-05-04 12:13:38

标签: c# nunit testcase testcasesource

我的测试方法如下:

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))

提前致谢!

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

您的初始测试采用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*/}

这只是一种方法。我不得不猜测你现有的数据和你想要做的事情。如果这种方法对你不起作用,请稍微填空,我会编辑答案。