今日もテストを書いてて Capybara に殺されそうになってる。

今日もテストを書いてて Capybara に殺されそうになってる。

コントローラーのテストの章が終わったのでフィーチャテストに進んだのですが、しょっぱなから Capybara 内でおこなった Model#create が visit 先のビューに反映されない事例に遭遇して死にそうになった。

Capybara でもコントローラーもビューも全部 Rails.env == 'test'なのにビューだけからっぽでなにが起こってるかさっぱりわからない。

泣きそうになりながら検索をすすめているとActiveRecord::Base.establish_connectionがどうのとかいう記事がでてきて、それでは解決しなかったんだけど connection で毎日 RSpec 内を検索するとデータベースクリーナー使うならこのモンキーパッチ当てなきゃ共有されなくていろいろとダメよという記述があった。

class ActiveRecord::Base
    mattr_accessor :shared_connection
    @@shared_connection = nil


    def self.connection
        @@shared_connection || retrieve_connection
    end
end
ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection

データベースクリーナーはつかってなかったものの共有されてない症状っぽいのでためしにモンキーパッチングしたら無事に Capybara 内でのモデル追加がビューに反映された。

なんでこんな挙動になるのかさっぱりわからないしひっかかってる人もいないし、本当に一人で地獄に迷い込んだっぽくなってつらかった。

UbuntuMySQL 14.14、Capybara 2.2.2、Rails 4.0.4、Ruby 2.1.1 などの構成です。