- 更新日: 2014年4月5日
- RSpec
RSpec+Capybaraテストのhave_selectorでNokogiri::CSS::SyntaxErrorエラー
RSpec + Capybara による Rails アプリのテストで、Request Spec で以下のようなテストを書きました。Nokogiri::CSS::SyntaxError というエラーが原因ぽいことに辿り着いたのですけど、結局直接的な解決策は見つけられず… 正規表現マッチャーを使って回避しました。
— 環境 —
rails-4.0.1
rspec-rails-2.14.0
capybara-2.2.0
ユーザーのポストが正しいCSS IDを持つことを確認するテスト
users#show (“user_path(user)”)のページで、ユーザーが投稿したポスト(user.posts)が正しい CSS ID を持って表示されているかを確認するテスト。
spec/requests/post_pages_spec.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
describe "user's show page" do let(:user) { FactoryGirl.create(:user) } before do FactoryGirl.create(:post, user: user) FactoryGirl.create(:post, user: user) visit user_path(user) end it "should render the user's posts" do user.posts.each do |post| expect(page).to have_selector("#post-#{user.id}-#{post.id}") end end end |
ユーザーのポストは、post-1-2(post-“ユーザーID”-“ポストID”)のような書式の CSS の id が付加されているとします。
Nokogiri::CSS::SyntaxError が発生
上述のテストで、users.posts を each で回して、have_selector で適切な CSS ID が設定されていることを確認しようとしたのですが、以下のエラーが発生しました。
1 2 3 4 |
Failure/Error: expect(page).to have_selector("#post-#{user.id}-#{post.id}") expected #has_selector?("#post-1838-") to return true, got false |
なぜか post.id が取得できず空になる。”post” の文字列を他のものに変更したら、post.id が取得できたりと謎だらけ。
色々とテストコードを変えつつ試してたら以下のように出て、Nokogiri が HTML 中の CSS 指定の部分をパースするとこでエラーになってるみたいです。
1 2 3 |
Nokogiri::CSS::SyntaxError |
解決できないので、代わりに have_xpath で試そうとしたら今度は以下のエラー。
1 2 3 |
Nokogiri::XML::XPath::SyntaxError: |
expect(page.html).to match で回避
結局原因が分からず解決策が見つからなかったので、正規表現のマッチャーを使ってテストしました。
1 2 3 4 5 6 7 |
it "should render the user's posts" do user.posts.each do |post| # somehow have_selector return Nokogiri::CSS::SyntaxError: # expect(page).to have_selector("#post-#{user.id}-#{post.id}") expect(page.html).to match(/post-#{user.id}-#{post.id}/) end end |
これでテストを通ったのですがなんか不安(笑。
- RSpec の関連記事
- FactoryGirlをSpringと共に使う時の注意
- 複数モデルのpost :createをテストするRSpecコード(Controller Spec)
- RSpec3でTime.nowをスタブ化(stub)
- RSpecでJSONによるPOSTリクエストをテスト
- RSpec & Capybara の雑感
- RSpec+Capybaraで同名の複数要素の並び順をテストする
- RSpec3ではrails_helper.rbがrequireされる
- Capybara + Launchy で RSpec テストをブラウザで確認
- CapybaraのwithinをRSpecで使う
- Serverspec(RSpec)のテスト出力に色を付けて見やすくフォーマット
Leave Your Message!