web-dev-qa-db-ja.com

文字列の配列をxunitテストメソッドに渡す

文字列の配列をXUnitテストメソッドの1つに渡したいのですが、次のようにするとうまくいきません(配列+パラメータメカニズム)。

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

しかし、私は問題を解決するためにもっと良いものがそこにあることを望んでいます。

教えて頂けますか?

19
Serge Intern

メソッドのstring[]引数の前に params を使用すると、InlineData属性のstring[]を初期化する必要がなくなり、代わりにstringリテラルの可変数を使用できますが、コンパイラーは1つの文句を言いません:

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

これは、配列が展開されるC#のparams機能です。したがって、xunitが1つの引数に入力できなかった場合は、次のように配列をキャストして強制することができます。

[InlineData((object)(new object[] { "2000-01-02", "2000-02-01" }))]ここ も参照してください。

5
robi-y

ClassDataまたはMemberData属性を使用できます。これらにより、必要なデータを返すメソッドを指定できます

メソッドは別のクラス(ClassData)またはテストと同じクラスのメソッド(MemberData)にすることができます

これはそれをうまく説明しています http://hamidmosalla.com/2017/02/25/xunit-theory-working-with-inlinedata-memberdata-classdata/

1
ChrisCa

これはうまくいくはずです

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

Uのようにオブジェクト配列を初期化すると、その上のすべての要素は単一のオブジェクトなので、文字列配列をパラメーターとして渡そうとすると、オブジェクト配列の最初の要素である「2000-01-02」が渡されます。

0