Rails的页面JS工作在真正的浏览器/手动测试,但不会在PhantomJS和硒规格(Rails p

2019-10-21 19:23发布

在我的Rails项目之一,我工作在接口上做一个资源(CRUD操作Commands )完全通过AJAX(即不需要重新加载页面)。 因此,有一个链接到一个命令添加到列表中,用户可以在任何命令即可编辑它的数据,然后点击保存通过AJAX更新,等等。 最后这一步操作(点击更新按钮)引起了我的麻烦:它完全在我试过的任何浏览器,但是当我按照我的水豚规格完全相同的步骤(使用PhantomJS或吵闹鬼司机)的规格无法对周围这一步。

我张贴,以寻求指导Re:怎样与此前进。 我可以逃脱在这种情况下不完整的测试覆盖率,但我很担心认为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.");
      }
    }
  })
});

该规范

下面是使用水豚,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命令记录提供。

当我打开浏览器并按照完全相同的步骤,如上面的水豚规范中定义时,控制器会看到以下参数预期:

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

但“命令”参数是不存在的,当我执行水豚规范,这将触发完全相同的JS代码。 这就是问题的症结所在; 见下文。

实际行为

(:命令)不存在当运行使用鬼驱 (PhantomJS)驱动的上述例子中,因为CommandsController必需的参数会产生错误。 但是,参数应该被包含在补丁请求; 请参见“定义所需的参数”在上面的JS。 取而代之的是,滑轨控制器接收以下PARAMS:

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

...这可以理解触发ParameterMissing错误:

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并尝试使用该驱动程序运行规范。 当我跑硒下的规范,它击中了更早的错误,看似毫无关联,但同样令人困惑。 我没有挖成这一个,因为我没有在硒很大的兴趣,并且错误让我头疼。 将发布更多,如果要求。

这是怎么回事?

任何想法,这里发生了什么,将不胜感激。 正如我前面所说,我可以跳过这个AJAX更新功能测试覆盖率; 我在我的jQuery的非常有信心(或至少我 ...),这将不会是一个因素在于,如果我能不知道这一点。 但不在乎得到与否PhantomJS可以用JavaScript这样被信任的感觉; 如果不能,那真的会降低我的信心在项目中。

提前致谢!

Answer 1:

更新:作为@Artjom乙建议,我升级到2.0.0 PhantomJS。 看来,这部分地解决了这一问题:在运行规范现在可以正确发送AJAX请求到服务器,但现在看来,成功的功能还是不执行(即HTML页面不会改变。)。 因此,至少这让我的地步,我可以做的这些80%的功能测试......不够好,预留了。



文章来源: Rails page JS works in real browser / manual testing but not in PhantomJS & Selenium specs