如何调用具有多个参数的测试方法(NUnit)
How to invoke test method with multiple parameters (NUnit)
我的测试方法是这样的:
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))
直接从列表中识别对象
提前致谢!
您可以 return 一个 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 是可选的,如果您想要一个比它组成的默认名称更有意义的名称。
I also don't understand how Nunit can recognize the objects from the
list directly with only TestCaseSource(nameof(Generator))
Nunit 注意到测试方法上的 TestCaseSource 属性,然后使用反射调用 "Generator" 方法。 (Nameof 只是糖,编译器会在您构建它时将其替换为实际名称)。每个 returned 的 TestCaseData 对象都是另一个测试用例。在我上面的示例中,测试将 运行 两次。 FirstTest 将有一个 Something 实例,其中 SomeValue 设置为 Hi 和一个 def 字符串 Foo。 SecondTest 将有一个 Something 实例,其中 SomeValue 设置为 Bye 和一个定义字符串 Bar.
您的初始测试采用 Something
类型的单个参数。显然,A.GenerateObjects()
return 是这些对象的某种 IEnumerable - 你没有显示细节。因为测试是一个单参数方法,所以行得通。 NUnit 为单参数方法提供了一个特例,它非常宽容,可以接受对象数组或所需类型,并为您自己生成测试用例。
但是,对于多个参数,由您自己 return 从您的方法中获取一组测试用例。您可能知道,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*/}
这只是一种方法。我不得不猜测您有哪些现成的数据以及您正在尝试做什么。如果此方法对您不起作用,请填写一些空白,我会编辑答案。
我的测试方法是这样的:
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))
直接从列表中识别对象提前致谢!
您可以 return 一个 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 是可选的,如果您想要一个比它组成的默认名称更有意义的名称。
I also don't understand how Nunit can recognize the objects from the list directly with only TestCaseSource(nameof(Generator))
Nunit 注意到测试方法上的 TestCaseSource 属性,然后使用反射调用 "Generator" 方法。 (Nameof 只是糖,编译器会在您构建它时将其替换为实际名称)。每个 returned 的 TestCaseData 对象都是另一个测试用例。在我上面的示例中,测试将 运行 两次。 FirstTest 将有一个 Something 实例,其中 SomeValue 设置为 Hi 和一个 def 字符串 Foo。 SecondTest 将有一个 Something 实例,其中 SomeValue 设置为 Bye 和一个定义字符串 Bar.
您的初始测试采用 Something
类型的单个参数。显然,A.GenerateObjects()
return 是这些对象的某种 IEnumerable - 你没有显示细节。因为测试是一个单参数方法,所以行得通。 NUnit 为单参数方法提供了一个特例,它非常宽容,可以接受对象数组或所需类型,并为您自己生成测试用例。
但是,对于多个参数,由您自己 return 从您的方法中获取一组测试用例。您可能知道,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*/}
这只是一种方法。我不得不猜测您有哪些现成的数据以及您正在尝试做什么。如果此方法对您不起作用,请填写一些空白,我会编辑答案。