ruby-on-rails – 如何测试rails 4确认对话与Capybara和Poltergeist?

我试图测试一个链接一个破坏动作引发一个本地浏览器确认框与正确的消息.

链接正在使用rails’link_to:

link_to 'Delete',user_path,method: :delete,data: { confirm: "Are you sure?" }

生成以下html:

<a data-confirm="Are you sure?" data-method="delete" href="/users/6" rel="nofollow">Delete</a>

功能在浏览器中正常工作,但我想在我的rspec功能规范中进行测试.

我试图清除浏览器的确认功能,如herethis gist所述,但是我无法使其工作.

it 'requests confirmation',js: true do
  visit user_path(user)
  page.execute_script "
    window.confirmMsg = null;
    window.confirm = function(msg) { window.confirmMsg = msg; return true; };"
  click_link 'Delete'
  expect(page.evaluate_script('window.confirmMsg')).to eq('Are you sure?')
end

从rspec发出以下错误

Failure/Error: expect(page.evaluate_script('window.confirmMsg')).to eq('Are you sure?')

       expected: "Are you sure?"
            got: nil

       (compared using ==)

但是,如果我直接通过page.execute_script直接打电话确认:

it 'requests confirmation',js: true do
  visit user_path(user)
  page.execute_script "
    window.confirmMsg = null;
    window.confirm = function(msg) { window.confirmMsg = msg; return true; };
    window.confirm('Are you sure?');"
  expect(page.evaluate_script('window.confirmMsg')).to eq('Are you sure?')
end

然后测试通过.

同时单击删除链接将导致测试失败,即使直接为page.execute_script调用确认:

it 'requests confirmation',js: true do
  visit user_path(user)
  page.execute_script "
    window.confirmMsg = null;
    window.confirm = function(msg) { window.confirmMsg = msg; return true; };
    window.confirm('Are you sure?');"
  click_link 'Delete'
  expect(page.evaluate_script('window.confirmMsg')).to eq('Are you sure?')
end

从rspec发出同样的错误

Failure/Error: expect(page.evaluate_script('window.confirmMsg')).to eq('Are you sure?')

       expected: "Are you sure?"
            got: nil

       (compared using ==)

为什么测试失败?而且,如何正确地测试确认对话?

语境:

我从Vagrant虚拟机运行我的测试,这是Ubuntu 12.04.4 LTS和运行ruby 2.1.2p95.

我的Gemfile.lock显示我有以下版本:

rails (4.1.4)
poltergeist (1.5.1)
capybara (2.4.1)

解决方法

page.driver.browser.accept_js_confirmed已被弃用.而是使用
page.accept_confirm do
  click_link 'Delete'
end

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...