文字列の配列を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)
しかし、私は問題を解決するためにもっと良いものがそこにあることを望んでいます。
教えて頂けますか?
メソッドのstring[]
引数の前に params
を使用すると、InlineData
属性のstring[]
を初期化する必要がなくなり、代わりにstring
リテラルの可変数を使用できますが、コンパイラーは1つの文句を言いません:
[Theory]
[InlineData("2000-01-02", "2000-02-01")]
public void TestSynchronizeMissionStaffing_PeriodNoMatch(params string[] dateStrings)
これは、配列が展開されるC#のparams機能です。したがって、xunitが1つの引数に入力できなかった場合は、次のように配列をキャストして強制することができます。
[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/
これはうまくいくはずです
[Theory]
[InlineData(new object[] { new string[] { "2000-01-02", "2000-02-01" } })]
public void TestSynchronizeMissionStaffing_PeriodNoMatch(string[] dateStrings)
Uのようにオブジェクト配列を初期化すると、その上のすべての要素は単一のオブジェクトなので、文字列配列をパラメーターとして渡そうとすると、オブジェクト配列の最初の要素である「2000-01-02」が渡されます。