我正在尝试使用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
答案 0 :(得分:4)
你必须考虑到RSpec正在尝试进行AJAX通话而不是水豚。
此外,Rails正在使用的是method: :put
和remote: 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