Rspec没有执行AJAX调用

时间:2012-04-27 10:02:44

标签: ruby-on-rails ajax selenium rspec capybara

我正在尝试使用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

1 个答案:

答案 0 :(得分:4)

你必须考虑到RSpec正在尝试进行AJAX通话而不是水豚。

此外,Rails正在使用的是method: :putremote: true正在使用UJS,其中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