【发布时间】:2020-06-13 01:24:34
【问题描述】:
我正在尝试测试指向销毁操作的链接是否会引发带有正确消息的本机浏览器 confirm 框。
正在使用 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 功能规范中对其进行测试。
我正在尝试删除浏览器的 confirm 函数,如 here 和 this 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 调用confirm:
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
那么测试通过了。
同样点击删除链接也会导致测试失败,即使confirm已经被直接调用为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)
【问题讨论】:
标签: ruby-on-rails rspec capybara poltergeist