読者です 読者をやめる 読者になる 読者になる

rubocopとsimplecov

rubocop使いつつsimplecov使おうとするとちょっと困ったのでメモ。

rubocop

Rubyでコードを書くとき、rubocopというlinterにお世話になっている。

tbpgr.hatenablog.com

公式:bbatsov/rubocop · GitHub

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

これならsimplecovhoge.error?trueのときのケースがあるか確かめられる。
しかし上述の通りrubocopはインライン化を望む。

fail 'an error occurred' if hoge.error?

こうすると「行単位で」c0かどうか判定するのでhoge.error?が常に実行される以上この行はテスト済みになってしまう。
うーん……。

解決策

特に思いつかなかったのでいったんrubocopの警告を無視して、該当箇所のテストを通したら戻している。
なにかうまいやりかたはないものか悩み中。