先日、id:ToMmY作のrspec-parameterizedというgemが公開されました。
はてな
シンプルながら、非常にクールです。
配列にパラメーターのパターンを書いて、eachでdescribeを記述するというのは、
皆やってると思うのですが、gem化して綺麗に見せられる方がかっこいいし可読性の向上にも繋がる。
READMEの記述例だと、検証したい結果を値で入れて、==マッチャで比較していますが、
パターンの中にカスタムマッチャとか、多少複雑な検証項目を直接仕込めないかなーと考えてみました。
で、思いついたのが、これ。
(5/23 0:40更新)
where(:a, :b, :c, :behavior) do [ [600, 600, 600, -> {should_not validate_hogehoge}], [400, 600, 600, -> {should_not validate_hogehoge}], [399, 600, 600, -> {should validate_hogehoge}], ] end with_them do subject {a + b + c} it { self.instance_exec(&behavior) } end
Procで検証式を書いて、後からinstance_evalでitのコンテキストで実行する。
どうも、スマートになりきれてない感はあるが、かなりやりたいことが実現できました。
仮引数にxを入れてるのは、instance_evalでselfがブロックに渡されるので、ArgumentErrorが出るため。
Proc.newかprocで書く方がいい気がしますが、ちょっとダサい気もする。
まあ、使わない引数用意してる時点で大分ダサいので、どっちでもいいような。
nagachikaさんにコメントで教えてもらったinstance_exec使えば、引数の問題は解決しました。
また、こういう書き方をした時の問題点として、
現状だと、Procのinspect出力がrspecの出力に出てしまって、微妙に見づらくなります。
これは出力の仕方を工夫すれば問題なさそうですが、
それより、この書き方が他の人の好みに合うかどうかですね。