1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

xUnitの[MemberData]での間違った型を、事前に防ぐ!

Last updated at Posted at 2019-05-13

#0.はじめに
みんな、一度はxUnitの[MemberData]で変な型をつけちゃうことあるよね?
ない?僕はあるんだよ!!!(キレ気味)
MissObj.PNG

でも、ToObjectCasterさえあれば、この通り!
自動で型の不整合をチェックしてくれるんだ!
Miss.PNG

ほかにも、たとえばこんなのや
Miss2.PNG

こんなのだって!
Miss3.PNG

ToObjectCasterを使えば、テストケースの型の間違いを事前に防ぐことができるんだ!

#1.xUnitについて
そもそも、xUnitについては知らないよって人は、↓の記事がとてもわかりやすいので読んでね!(けして説明がめんどうだからではない)
xUnit.net でユニットテストを始める
.NET Coreで単体テストを行う

##テストケースの型を間違っちゃう問題
xUnitの[InlineData], [MemberData], [ClassData]を利用するとき、IEnumerable<object[]>を返すプロパティ・メソッド・クラスを作成します。しかし、値が全てobject[]であるため、間違った型の値を入力しても実行までエラーが出ません。
なので、コンパイル段階でエラーとするために、先に型のチェックをしてからobjectに変換するということを考えます。
ToObjectCasterクラスのMakeCastメソッドによって生成されたToObjは、引数をobject[]に変換する関数です。

#2.実装
バーン!!!!!!
ToObjectCaster.PNG

(引数の数だけ型があるので当然っちゃ当然だけど......)
(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[]にキャストする関数を用意する、ということを考えてみました。

元ネタの方がコレクション初期化子を使ってキレイに書けるので、そっちの方がいいかもしれない

最後まで読んでくれてありがとう!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?