ことの発端はApartmentとsimplecov+guardの相性が悪いということでした。
しばらくsimplecovを使っていなかったのですが、お金関係の実装をしていてさすがにテストのカバレッジが気になったのでsimplecovを再度入れてみたところ、不可解な現象が生じました。
一部のクラスだけカバレッジが反映されていない。。
本質的な理由はよくわからないのですが、どうやらApartmentのinitializerでexcluded_modelsを設定しているクラスに関してカバレッジが反映されないということがわかりました。githubでは同様の現象をApartmentの開発者に問い合わせている痕跡を見つけることができたものの、「なぜ?」という部分に関しては謎なままissueがcloseに。
いろいろと調べた結果、どうやらApartmentがinitializerですでにクラスをロードしていることが原因と考えられます。そしてこれはguardでspringを使ってrspecを走らせた場合に限ると。つまりguardでspringを走らせた場合は
1.Apartment.initializer
2.excluded_modelsのロード
3.simplecovのスタート
となり、bundle exec guardで走らせた場合は
1.simplecovのスタート
2.Apartment.initializer
3.excluded_modelsのロード
となるわけです。
simplecovはスタートした時点で監視を始めるので、その前にロードされたものに関しては無視するということではないか?というのが仮説ですが、真相はまだわかりません。
最低限やりたいことの条件としては
1.guardを使ってrspecを常に走らせることはしたい。
2.guardを使ってrspecを走らせている時はいちいちカバレッジは更新されなくてもよい。
ということでspec_helperの頭には
[code lang=”ruby”]
# bundle exec rspec specの時だけsimplecovを動かす
# bundle execで直接rspecを実行した場合
# この時点ではrails_envが設定されていないためこれを利用する
unless ENV[‘RAILS_ENV’]
require ‘simplecov’
SimpleCov.start ‘rails’do
add_filter ‘app/exceptions/’
add_group ‘Validators’, ‘app/validators’
end
end[/code]
rails_helper側の頭は
[code lang=”ruby”]
NV[‘RAILS_ENV’] ||= ‘test’
require ‘spec_helper’
require File.expand_path(‘../../config/environment’, __FILE__)
require ‘rspec/rails’
[/code]
とすると、bundle exec rspecを実行した時のみcoverageを動かすことができる。