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,而是 capybara。

此外,Rails 正在做什么method: :put并且remote: true正在使用 UJS,而 capybararack/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 回答