我有一个按钮,当它被点击时,它会触发ajax帖子,并呈现警告。
效果很好,但在进行测试时,咖啡因并没有很好地执行。
应用/视图/警报/ index.html.haml
= link_to icon('plus', 'Show Alert'), new_alert_path, class: 'btn btn-with-icon btn-primary', remote: true
应用/控制器/ alerts_controller.rb
class AlertsController < BaseController
def new
@alert = Alert.new
end
end
应用/视图/警报/ new.js.coffee
console.log "1" # => This is being executed
AlertComponent.show "show this message" # Here it breaks I think
console.log "2" # => It never arrives here
应用/资产/ JavaScript的/ alert_component.js.coffee
class AlertComponent
@show: (description) ->
console.log "3" # => This is not being executed
# => Does some other stuff
end
window.AlertComponent = AlertComponent
click_link 'Show Alert' # => This is executed because I added a binging.pry in the controller and it arrives properly
wait_for_ajax
p page.driver.console_messages # => Below is what it returns
expect(page).to have_css '.alert-div'
测试失败, page.driver.console_messages 返回此信息:
{:line_number =&gt; 0,:message =&gt;&#34; ReferenceError:无法找到变量:AlertComponent&#34;,:source =&gt;&#34; undefined&#34;} < / p>
正如我已经说过的,它在开发和生产方面非常有用。问题在于测试。
我正在使用Capybara-webkit:
规格/ rails_helper.rb
ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
# Prevent database truncation if the environment is production
abort("The Rails environment is running in production mode!") if Rails.env.production?
require 'spec_helper'
require 'rspec/rails'
Capybara.javascript_driver = :webkit
# more stuff
关于为什么这不能按预期工作的任何想法?
答案 0 :(得分:0)
在讨论rails资产管道时,开发和测试/生产之间的最大区别在于,在开发过程中,每个JS文件都是单独提供的,而在测试/生产中,它们被连接在一起并作为一个文件提供。这意味着一个文件中的JS错误不会阻止其他文件在开发模式下处理,但它可以处于测试/生产模式。看起来它可能在创建AlertComponent类之前中止对连接文件的评估。
在开发模式下运行应用程序时检查浏览器开发人员控制台,并修复正在记录的任何JS错误。