2012-04-27 2 views
1

Я пытаюсь проверить ссылку, которая вызывает действие контроллера с помощью ajax. По сути, когда пользователь нажимает «Follow», он будет связан с компанией, а частичный результат будет выполнен с JS. Проблема в том, что он работает правильно, когда я пытаюсь его в разработке, но он не отвечает в тестах. Я пытался много способов, и похоже, что вызов никогда не попадает на контроллер.Rspec не выполняет вызовы AJAX

Здесь вы можете увидеть тест:

#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 
+0

Что такое тестовый журнал? –

+0

@Gawyn: вы нашли решение для этого? я также имею такую ​​же проблему. – Alan

ответ

4

Вы должны принять во внимание, что это не RSpec, который пытается сделать этот вызов AJAX, но capybara.

Кроме того, что Rails делает с этой method: :put и remote: true использует UJS, который водосвинка с rack/test не обрабатывает хорошо вне коробки (потому что это означает, JavaScript). Это, вероятно, также было бы правдой, если бы вы даже не использовали remote: true, а только method: :put.

Держу пари, если вы используете Капибара-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

+0

Прежде всего, спасибо за ваш ответ @josepjaume! Я пробовал ваш подход, но безрезультатно: все равно. :( – Gawyn

+0

Серьезно? Даже при использовании 'capybara-webkit' или' selenity'? – josepjaume

+0

Не повезло с capybara-webkit. Я также пробовал с селеном, но ничего. – Gawyn

Смежные вопросы