0

Within a rails app, I have an image (image_submit_tag) on a page that, when selected, sends an ajax request to server. 服务器收到请求,做正确的事并用正确的 javascript 响应。正确的 javascript 将一个图像替换为另一个图像。所有这些都在 cucumber/capybara/webkit 环境之外工作。换句话说,对于人类。

当我使用带有@javascript 标记的 webkit (capybara-webkit 1.0.0) 与 cucumber(1.3.9)/capybara (2.1.0) 下的 rails(3.2.9) 应用程序的单个测试(功能)相同时,我看到不同的结果。

在测试环境中,响应 javascript 没有被 webkit 评估。相反,在尝试在页面上查找新图标的后续步骤中,当我转储 page.html 时,报告的所有内容都是 javascript 响应。也就是说,该页面仅包含返回的 javascript。

这是应该能够看到新内容的步骤(它与上面的描述不同,因为我已经简化了响应 javascript 以试图消除 js 错误的可能性)。

Then(/^the "(.*?)" icon should be displayed$/) do |icon|
  puts "------------------icon display on page------------------"
  puts page.html
  puts "________________________________________________________"
  puts "************* icon displayed response headers ***"
  put page.response_headers.inspect
  puts "*************************************************"
  page.should have_content("some text")
end

我在上面描述了 page.html 的输出,但是响应标头增加了难题。出于某种原因,webkit (?) 认为响应有问题。

bad URI(is not URI?): {"Content-Type"=>"text/javascript; charset=utf-8", 
  "X-Ua-Compatible"=>"IE=Edge,chrome=1", 
  "Etag"=>"\"e7d3ccc2c53dd8e31d6f92d7dbb69dc0\"", 
  "Cache-Control"=>"max-age=0, private, must-revalidate", 
  "X-Request-Id"=>"776cf759cc343884091b5daec6a18587", 
  "X-Runtime"=>"0.048413", 
  "Server"=>"WEBrick/1.3.1 (Ruby/1.9.3/2013-02-22)", 
  "Date"=>"Fri, 08 Nov 2013 03:07:43 GMT", 
  "Content-Length"=>"47", "Connection"=>"Keep-Alive"} 
(URI::InvalidURIError)

最后,这是由 rails 返回的实际 javascript,就像我说的,我已将其剥离到最低限度。

$('#go_on_duty').parent().html("some text");

通过四处寻找答案,我会预料到一些问题:
1. 是的,我设置了 Capybara.javascript_driver = :webkit。
2. 是的,该功能被标记为@javascript

那么,有谁知道为什么 javascript 不会被评估?我暗自怀疑我遗漏了一些明显的东西,但我的眼睛已经变得疲倦了。

在相关的说明中,我只是到此为止,因为我在对 javascript 的请求中明确设置了 Accept 标头。我可以这样做 b/c 我正在使用 webkit(如下所示)

page.driver.header 'Accept', 'text/javascript, application/javascript, application/ecmascript, application/x-ecmascript'

在添加上述行之前,我的请求“作为 HTML”到达服务器,所以我什至没有得到 partial.js.erb 渲染。我愿意暂时接受上述解决方法,但我不禁认为这些问题也是相关的,例如“我忽略了一些简单的 capybara/rails/cucumber 配置问题”。同样,这只是测试环境中的一个问题;当人为驱动时,交互按预期工作。


更新:

应大众需求,这里部分生成image_submit_tag

<%= form_tag(shifts_start_shift_path, :method => :post , :remote => true) do %>
  <%=image_submit_tag("go_on_duty_sign.png", :size=> "35x35", 
                                             :id => "go_on_duty", 
                                             :title=>"Go On Duty") %> 
<% end %>

以下是相关控制器的操作代码:

def start_shift
  @shift = current_staff.current_shift
  if !current_staff.on_duty?
    @task_assignments = TaskAssignment.where(:shift_id => @shift.id)
    respond_to do |format|
      format.js
    end
  end
end

这是用于呈现响应的 start_shift.js.erb 模板中的 js 单行(从上面复制,显然是最小化的):

$('#go_on_duty').parent().html("some text");

我希望这有助于澄清问题,但我会再次强调这一切都是由人为驱动的。我只在测试环境下看到问题。谢谢...


环境:

gem 'rails', '3.2.9'

group :test do
    gem 'cucumber-rails', '1.4.0'
    gem 'rspec-rails', '2.7.0'
    gem 'database_cleaner', '0.7.0'
    gem 'factory_girl', '2.3.2'
    gem 'capybara-webkit', '1.0.0'
end  
4

0 回答 0