#0.はじめに
みんな、一度はxUnitの[MemberData]で変な型をつけちゃうことあるよね?
ない?僕はあるんだよ!!!(キレ気味)
でも、ToObjectCasterさえあれば、この通り!
自動で型の不整合をチェックしてくれるんだ!
ToObjectCasterを使えば、テストケースの型の間違いを事前に防ぐことができるんだ!
#1.xUnitについて
そもそも、xUnitについては知らないよって人は、↓の記事がとてもわかりやすいので読んでね!(けして説明がめんどうだからではない)
xUnit.net でユニットテストを始める
.NET Coreで単体テストを行う
##テストケースの型を間違っちゃう問題
xUnitの[InlineData], [MemberData], [ClassData]を利用するとき、IEnumerable<object[]>を返すプロパティ・メソッド・クラスを作成します。しかし、値が全てobject[]であるため、間違った型の値を入力しても実行までエラーが出ません。
なので、コンパイル段階でエラーとするために、先に型のチェックをしてからobjectに変換するということを考えます。
ToObjectCasterクラスのMakeCastメソッドによって生成されたToObjは、引数をobject[]に変換する関数です。
(引数の数だけ型があるので当然っちゃ当然だけど......)
(xUnitがValueTupleに対応してさえいれば......(でも、0と1のタプルどうするの?))
(リポジトリは、ないです......)
#3.さいごに
実はこの記事には元ネタがあります。
Creating strongly typed xUnit theory test data with TheoryData
(TheoryDataで強く型付けられたxUnitのTheoryテストデータを作る)
↑の記事の方法は、非ジェネリックなTheoryDataクラスでIEnumerable<object[]>を実装し、それを継承したジェネリックなTheoryDataクラスで型チェック用のAddメソッドを実装している、といった感じです。
本記事の方法は、筆者がEnumratorに慣れていなかったので、IEnumerable<object[]>の実装はListを使い、それを初期化する際に型をチェックしてobject[]にキャストする関数を用意する、ということを考えてみました。
元ネタの方がコレクション初期化子を使ってキレイに書けるので、そっちの方がいいかもしれない
最後まで読んでくれてありがとう!