Subscribed unsubscribe Subscribe Subscribe

@kyanny's blog

Write down what I learnt. Opinions are my own.

Re: My experience with Minitest and RSpec

My experience with Minitest and RSpec | Tenderlovemaking

MiniTest の良い点は使ったことが少ないので同意も反対もできないし、 RSpec の嫌なところは完全に同意できるが、 before に関するくだりの

For the nested context, I would like to print “hello!” before it prints “hi!”. In a normal inheritance situation, I would change the call to super.

ここだけよくわからなかった。 before の実行順序に関する不満が Ruby のクラスの継承を使えば意のままにコントロールできる、という主張のように読めるが、それを MiniTest で書いてみるとこういう風になると思う。

gist2576ce8d9cb472a5cd5f

確かに子クラスの setup メソッドでの super の使い方によって親クラスの setup メソッドが実行されるタイミングを制御できるが、 MiniTest (というか xUnit 系のテストフレームワーク)の場合、本当にこんなふうに setup と継承で「ネストされた前処理」を書いたりするもんなのかなぁ、という疑問がある。

RSpec の(数少ない)良いところは describe の入れ子によって(視覚的に)階層構造を表現できることと、入れ子の各段階それぞれに before で前処理を定義できることだと思っている。視覚的にネストされたとおり「外側が先に」実行されていく、という構造はとてもわかりやすいと思う。

上に書いた MiniTest で継承を使った場合だと、視覚的なわかりやすさは劣るし、親クラスが別ファイルに定義されていて require されている、みたいな状況だとよりいっそう読みづらくなってしまう気がする。

(RSpec でも shared example を濫用すれば同様の問題が起こるし、ネストを深くして各段階に before を置いたりすると変更に弱い spec になってしまうのでそもそも悪手ではあるのだが)