2

ajaxを使用してコントローラーアクションを呼び出すリンクをテストしようとしています。基本的に、ユーザーが[フォロー]をクリックすると、ユーザーは会社に関連付けられ、部分レンダリングがJSで実行されます。問題は、開発で試してみると正しく動作するのに、テストでは応答しないことです。私はさまざまな方法で試してきましたが、呼び出しがコントローラーに到達しないようです。

ここでテストを見ることができます:

#spec/integration/following_spec.rb

it "should add the company to the ones followed by the user", :js => true do
  find("#current_company").click_link "Follow"
  sleep 2
  @user.companies_followed.include?(@company).should be_true
end  

景色:

#app/views/companies/_follow_button.html.slim

= link_to change_follow_state_company_path(@company), :method => :put, :remote => true, :id => "follow", :class => "btn_block light" do
' Follow 

そしてテスト構成:

#spec/integration_helper.rb

require 'spec_helper'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'capybara/rspec'
require 'capybara/rails'

Dir[Rails.root.join("spec/integration/support/**/*.rb")].each {|f| require f}

RSpec.configure do |config|
  config.use_transactional_fixtures = true

  config.before do
    clear_email_queue
  end
end

Rails.cache.clear
4

1 に答える 1

4

そのAJAX呼び出しを行おうとしているのはRSpecではなく、カピバラであることを考慮に入れる必要があります。

また、Railsがそれを使って行っていることmethod: :putremote: trueUJSを使用していることは、capybaraがそのままでrack/testはうまく処理できないことです(javascriptを意味するため)。remote: trueを使用していなくても、それだけを使用している場合も、おそらくそれは当てはまりますmethod: :put

あなたがcapybara-webkitを使用するなら、それは起こらないでしょう:

# Gemfile
gem 'capybara-webkit'

# spec/integration_helper.rb
Capybara.default_driver = :webkit

それがうまくいくなら、それがrack/testあなたに問題を与えているのです。これは、JavaScriptを扱う場合はあまり良くないためです。キュウリには何かと呼ばれるものcapybara_javascript_emulationがありますが、テストを行うときはそれに依存しません。

私のアプローチ:javascriptを必要とするテストでドライバーを切り替え、rack-test単純なテストではナイーブに依存します:)

また、spinach神のために、を使用してください!(またはturnip、少なくとも):D

于 2012-04-27T10:22:37.163 に答える