Rails Page JS在真正的浏览器/手动测试中工作,但在Phantomjs&Selenium Specs中不使用[英] Rails page JS works in real browser / manual testing but not in PhantomJS & Selenium specs

问题描述

在我的一个Rails项目中,我正在通过Ajax完全对资源(Commands)进行CRUD操作(即,无需重新加载).因此,有一个链接可以将命令添加到列表中,用户可以单击任何命令以编辑其数据,然后单击"保存"通过AJAX更新,依此类推.最后一个操作(单击"更新"按钮)会给我带来麻烦:它在我尝试过的任何浏览器中都可以很好地工作,但是当我遵循Capybara Specs(使用Phantomjs或Poltergeist驱动程序)中完全相同的步骤时,Specs立即失败那一步.

我要发布以寻求指导:如何继续前进.在这种情况下,我可以摆脱不完整的测试覆盖范围,但是我担心我认为phantomjs不能正确执行所有页面JavaScript. (由于无关的原因,此应用程序很大程度上依赖Phantomjs,因此对我来说,重要的是要知道其JS执行程度.)

有人知道phantomjs执行jQuery ajaxy js的任何情况下,

预先感谢.详细信息和代码片段如下.任何想法都将受到赞赏.

具体细节

有害的JS

这是香草jQuery.没有什么太复杂了.

// User clicks "Save" in a URL edit form to update that URL
$('.command .update_url').click(function(){
  var command = $(this).parents('.command');
  var command_path = command.attr('command_path');
  var new_url = command.find('.url_field').val();

  $.ajax({
    type: 'PATCH',
    url: command_path,
    data: { command: { url: new_url }}, // <-- (Defines required param)
    success: function(data){
      if (data.success) {
        // ... Close edit window & display cues that save is complete
      } else {
        alert("Unable to save changes. Please refresh the page.");
      }
    }
  })
});

规格

以下是使用Capybara,FactoryGirl和其他不多的普通RSPEC集成测试.

@user = create :user
@site = create :site, user: @user
@command = create :command, site: @site, url: "http://example.com/123"

stub_login(@user) # a helper I wrote that stubs Devise #current_user etc.
visit site_path(@site)
first('.command .edit_link').click

within '.editing' do
  fill_in 'url', with: "http://example.com/456"
  click_button "Save" # <-- (This triggers the above listener)
  # <-- (PhantomJS: Controller hits an error here) 
end

# <-- (The spec fails before this point)
page.should have_css '.command .edit_link', text: "http://example.com/456"
page.should_not have_css '.url_field'
@command.reload.url.should eq  "http://example.com/456"

预期行为

再次,这在真实的现场浏览器中完美地工作.应该这样做,因为上面的Ajax非常普遍,并且不是特别复杂.

单击按钮时,触发了上述JS侦听器.侦听器聚集了几个变量,然后将请求发送到Rails应用程序以使用提供的URL更新该命令记录.

当我打开浏览器并遵循与上述Capybara规格中定义的完全相同的步骤时,控制器会看到以下参数,如预期:

Parameters: {
  "command" => {"url"=>"http://example.com/456"},
  "action" => "update",
  "controller" => "commands",
  "id" => "578"}

但是,当我执行Capybara Spec时,"命令"参数不存在,该规范触发完全相同的JS代码.这就是问题的症结;请参阅下面.

实际行为

当我使用 poltergeist (phantomjs)驱动程序运行上述示例时,命令scontroller会引起错误,因为不存在必需的参数(:命令).但是该参数应包含在补丁请求中;请参阅上面的JS中的"定义必需的参数".相反,导轨控制器接收以下参数:

Parameters: {
  "action" => "update",
  "controller" => "commands",
  "id" => "934"}

...可以理解地触发参数错误:

1) Command pages user updates command URL
   Failure/Error: Unable to find matching line from backtrace
   ActionController::ParameterMissing:
     param not found: command
   # /Users/topher/.rvm/gems/ruby-2.0.0-p598/gems/actionpack-4.0.3/lib/action_controller/metal/strong_parameters.rb:173:in `require'
   # ./app/controllers/commands_controller.rb:46:in `command_params'
   # ./app/controllers/commands_controller.rb:14:in `update'

请注意,当我在浏览器中手动运行完全相同的步骤时,控制器会收到其他参数(请参见上文),因此不会发生错误.

出于好奇,我安装了selenium-webdriver,并尝试使用该驱动程序运行规格.当我在Selenium下运行规格时,它甚至很快就会遇到错误,似乎无关但同样令人困惑.我没有挖到这个,因为我对硒没有太大的兴趣,而且错误使我的头部受伤.如果要求,将发布更多.

发生了什么事?

关于这里发生的事情的任何想法将不胜感激.如上所述,我可以跳过此AJAX更新功能的测试覆盖范围;我对自己的jQuery(或至少是是 ...)非常有信心,如果我不能弄清楚这一点,那将不会是一个破坏者.但是,我 do 都在想了解phantomjs是否可以通过这样的javascript信任.如果不能的话,这确实会减少我对项目的信心.

预先感谢!

推荐答案

更新:正如@a​​rtjom B所建议的那样,我升级到phantomjs 2.0.0.看来这部分解决了问题:现在运行规格现在正确地将AJAX请求发送到服务器,但是似乎成功函数仍未执行(即,页面HTML不会更改).因此,至少这使我进入了我可以对这些功能进行80%测试的地步...现在足够好,可以放在一边.

本文地址:https://www.itbaoku.cn/post/1740124.html