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

Ser*_*ern 15 arrays xunit xunit.net

我想将一个字符串数组传递给我的一个XUnit测试方法,但是当我执行以下操作时它不起作用(array + params机制)

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

我可以解决这个问题:

    [Theory]
    [InlineData(0, new object[] { "2000-01-02", "2000-02-01" })]
    public void TestSynchronizeMissionStaffing_PeriodNoMatch(int dummy, string[] dateStrings)
Run Code Online (Sandbox Code Playgroud)

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

你能告诉我吗?

yai*_*air 23

params在方法的string[]参数之前使用,然后你不需要初始化string[]in InlineData属性,而是可以使用可变数量的string文字,编译器不会抱怨它:

[Theory]
    [InlineData("2000-01-02", "2000-02-01")]
    public void TestSynchronizeMissionStaffing_PeriodNoMatch(params string[] dateStrings)
Run Code Online (Sandbox Code Playgroud)

  • 我如何传递一个空集合? (2认同)

Hoc*_*eyJ 21

为了搜索者的利益 - 在 2020 年,这在没有paramsobject铸造的情况下是可能的。

让它发挥良好作用的关键似乎是在编写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);
}
Run Code Online (Sandbox Code Playgroud)

  • @MaiconHeck,雅各布所说的似乎仍然正确。我正在使用 _xunit 2.4.1_ 和 _xunit.runner.visualstudio 2.4.3_ 并且 Visual Studio 会抱怨,除非我使用一些原始参数启动 InlineData() 属性。 (4认同)
  • @MattM - 他们通过在其前面放置一个虚拟属性来使其工作,例如,`public void MyTest(int iLiterallyDoNotCare, string [] importantArray)`和`[InlineData(666, new string [] { "Puppies", "小猫”})]` (4认同)
  • 实际上,当你只有一个参数(数组)时,它不起作用,但是当你有多个参数而不是一个数组时,它就可以正常工作。 (3认同)
  • 更新(xunit 2.4.1 / xunit.runner.visualstudio 2.4.2):现在它仅使用数组参数@Jacob (2认同)

小智 8

这应该有效

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

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


rob*_*i-y 5

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

[InlineData((object)(new object[] { "2000-01-02", "2000-02-01" }))] 另见这里.