rubocopとsimplecov
rubocop使いつつsimplecov使おうとするとちょっと困ったのでメモ。
rubocop
Rubyでコードを書くとき、rubocopというlinterにお世話になっている。
rubocopではifブロックの中身が1行のとき後置ifで書くことが推奨されている。
例えば以下の通り
if num >= 10 num -= 10 end
↓
num -= 10 if num >= 10
こういうインライン化はdo endにも適用されていてrubocopの基本的な信念のようだ。
simplecov
Rubyでテストのカバレッジをとるならこれっぽい。が、測定がc0レベル。
行単位で実行したかどうかを見るのでクラス定義とかは全くテストを書かなくてもテスト済みになる。
例えば下記のコードはテストを書くまでもなくカバレッジ100%だ
(requireしてロードしてやる必要はあるが)
module Hoge end
動的にメソッドやクラスが定義される分だけc1以上を目指して測定してその結果を出力するのってかなり難しそう。
本題
simplecovがc0なのはいいんだけど例えば以下のコード。
if hoge.error? fail 'an error occurred' end
これならsimplecovでhoge.error?がtrueのときのケースがあるか確かめられる。
しかし上述の通りrubocopはインライン化を望む。
fail 'an error occurred' if hoge.error?
こうすると「行単位で」c0かどうか判定するのでhoge.error?が常に実行される以上この行はテスト済みになってしまう。
うーん……。
解決策
特に思いつかなかったのでいったんrubocopの警告を無視して、該当箇所のテストを通したら戻している。
なにかうまいやりかたはないものか悩み中。