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の警告を無視して、該当箇所のテストを通したら戻している。
なにかうまいやりかたはないものか悩み中。