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

プログラミング 美徳の不幸

Ruby, Rails, JavaScriptなどのプログラミングまとめ、解説、備忘録。

SinatraでCapybara使う

今取り組んでいるSinatraによるプロジェクトも佳境を迎え、納品に向けて受け入れに近いレベルのテストを書いています。
まぁ本格的な受け入れテストではないんですが、返却されたviewが正しい値を含んでいるかのテストを中心とするわけですが、そのうえでCapybaraが提供するいくつかのMatcherが欲しかったのです。そのMatcherとはhas_css
これはこのように使います。

get '/'
last_response.body.should have_css("#game_result")

これの何が便利かというと、idの場合はわかりにくいですが例えば
last_response.body.should have_css(".game_user", count: 3)
とかすると、game_userが3人含まれていることがわかります。have_cssのcountオプションは超強力です。

で、これを使いたかったんで他のvisitとかfill_inとかたぶん要らないんだけど、ひとまずSinatraのテスト環境にCapybaraを入れたい、と思ったが入らない!!

なんか
page.should have_css("#game_result")とかするとundefined method 'has_css?'とか言われるんですね。いや、俺が呼んだのはhave_cssだろ、みたいな。

でまぁ、以下の設定が必要でした。

◯spec/spec_helper.rb
require 'capybara'
require 'capybara/dsl'
require 'capybara/rspec'
RSpec.configure do |config|
config.include Rack::Test::Methods
config.include Capybara::DSL
config.include Capybara::RSpecMatchers
end

で、いろいろな記事見てもなぜか'capybara/rspec'をrequireするのとCapybara::RSpecMatchersをincludeするのは書いてないんだよね。。。あれ本当に動いてるのかな?

まぁ言われれば、そりゃMatcherのモジュールインクルードしないといけないのは当たり前なんだけど。ちなみにMatcherがhave_cssとかの拡張で、DSLがvisitとかだっていう認識でいいでしょうかね。