在我的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这样被信任的感觉; 如果不能,那真的会降低我的信心在项目中。
提前致谢!