我想将一个字符串数组传递给我的 XUnit 测试方法之一,但是当我只执行以下操作时它不起作用(数组 + 参数机制)
[Theory]
[InlineData(new object[] { "2000-01-02", "2000-02-01" })]
public void TestSynchronizeMissionStaffing_PeriodNoMatch(string[] dateStrings)
我可以像这样解决这个问题:
[Theory]
[InlineData(0, new object[] { "2000-01-02", "2000-02-01" })]
public void TestSynchronizeMissionStaffing_PeriodNoMatch(int dummy, string[] dateStrings)
但我希望有更好的方法来解决这个问题。
你能告诉我吗?
为了搜索者的利益 - 2020 年,无需
params
或 object
选角即可实现此目的。
让它发挥良好的关键似乎是在编写
InlineData
部分之前编写方法签名。这是一些工作代码:
[Theory]
[InlineData(true, "expected", new string[] { "expected", "another" })]
[InlineData(false, "nope!", new string[] { "expected", "another" })]
public async void StringCheck_WithInputs_ExpectResultsMatch(bool expectedResult, string expectedString, string[] possibleStrings)
{
bool actualResult = false;
foreach(var row in possibleStrings)
{
if(row == expectedString)
{
actualResult = true;
}
}
Assert.Equal(expectedResult, actualResult);
}
这应该有效
[Theory]
[InlineData(new object[] { new string[] { "2000-01-02", "2000-02-01" } })]
public void TestSynchronizeMissionStaffing_PeriodNoMatch(string[] dateStrings)
当您像初始化对象数组一样,它上面的所有元素都是单个对象,因此当您尝试将字符串数组作为参数传递时,它会传递对象数组的第一个元素,即“2000-01-02”。
这是一个 C# 参数功能,其中扩展了数组。因此 xunit 无法将其输入到您的一个参数中,您可以强制转换数组来强制它,如下所示:
[InlineData((object)(new object[] { "2000-01-02", "2000-02-01" }))]
另请参阅此处。
您可以使用
ClassData
或 MemberData
属性。这些允许您指定返回所需数据的方法
该方法可以位于单独的类中 (
ClassData
) 或与测试位于同一类中的方法 (MemberData
)
这很好地解释了它 http://hamidmosalla.com/2017/02/25/xunit-theory-working-with-inlinedata-memberdata-classdata/
我相信这是 XUnit 的一个错误。我已经在这里举报了:
每当您需要将字符串数组作为参数传递给测试时,您都可以使用您的代码,只需将“params”关键字添加到前面的字符串数组中即可。效果很好。
[Theory]
[InlineData(new object[] { "2000-01-02", "2000-02-01" })]
public void TestSynchronizeMissionStaffing_PeriodNoMatch(params string[] dateStrings)
{
//Assert.[YourVerifier]();
}
我正在使用 Xunit 版本
2.4.1
并使用上面 ChrisCa
的答案。我可以简单地在下面执行此操作,这样可以将数据与测试分开。
public class NoGenTests
{
[Theory]
[MemberData(nameof(NoGenTestsData.Nos), MemberType = typeof(NoGenTestsData))]
public void NoGenTest(int size, int[] nos)
{
/*
foreach (var item in nos)
{
Console.WriteLine("Item is " + item);
}*/
Assert.Equal(size, nos.Length);
}
}
public class NoGenTestsData
{
public static object[] Nos =
{
new object[] {3, new int[] {2, 3, 5}},
new object[] {6, new int[] {2, 3, 5, 7, 11, 13}},
new object[] {7, new int[] {2, 3, 5, 7, 11, 13, 17}},
new object[] {8, new int[] {2, 3, 5, 7, 11, 13, 17, 19}},
new object[] {2, new int[] {2, 3}},
new object[] {1, new int[] {2}}
};
}