将字符串数组传递给 xunit 测试方法

问题描述 投票:0回答:8

我想将一个字符串数组传递给我的 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)

但我希望有更好的方法来解决这个问题。

你能告诉我吗?

arrays xunit xunit.net
8个回答
71
投票

在方法的 params

 参数之前使用 
string[]
,然后您不需要在 
string[]
属性中初始化
InlineData
,而是可以使用可变数量的
string
文字,其中编译器一点也不抱怨:

[Theory]
    [InlineData("2000-01-02", "2000-02-01")]
    public void TestSynchronizeMissionStaffing_PeriodNoMatch(params string[] dateStrings)

43
投票

为了搜索者的利益 - 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);
}

7
投票

这应该有效

[Theory]
[InlineData(new object[] { new string[] { "2000-01-02", "2000-02-01" } })]
public void TestSynchronizeMissionStaffing_PeriodNoMatch(string[] dateStrings)

当您像初始化对象数组一样,它上面的所有元素都是单个对象,因此当您尝试将字符串数组作为参数传递时,它会传递对象数组的第一个元素,即“2000-01-02”。


5
投票

这是一个 C# 参数功能,其中扩展了数组。因此 xunit 无法将其输入到您的一个参数中,您可以强制转换数组来强制它,如下所示:

[InlineData((object)(new object[] { "2000-01-02", "2000-02-01" }))]
另请参阅此处


3
投票

您可以使用

ClassData
MemberData
属性。这些允许您指定返回所需数据的方法

该方法可以位于单独的类中 (

ClassData
) 或与测试位于同一类中的方法 (
MemberData
)

这很好地解释了它 http://hamidmosalla.com/2017/02/25/xunit-theory-working-with-inlinedata-memberdata-classdata/


0
投票

我相信这是 XUnit 的一个错误。我已经在这里举报了:

https://github.com/xunit/xunit/issues/2456


0
投票

每当您需要将字符串数组作为参数传递给测试时,您都可以使用您的代码,只需将“params”关键字添加到前面的字符串数组中即可。效果很好。

[Theory]
[InlineData(new object[] { "2000-01-02", "2000-02-01" })]
public void TestSynchronizeMissionStaffing_PeriodNoMatch(params string[] dateStrings)
{
   //Assert.[YourVerifier]();
}

0
投票

我正在使用 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}}
        };
}

© www.soinside.com 2019 - 2024. All rights reserved.