jquery - 在 Capybara 测试中使用 jQuery

标签 jquery testing rspec capybara acceptance-testing

我想询问您对在 Capybara 规范中使用 jQuery 的看法。 它是真的在模拟真实的用户交互,还是假装

  • 正在使用 find("#my_checkbox[value='1']").set(true)

    page.execute_script("$('#my_checkbox').prop('checked', true);") 相同吗?

  • find("#my_button").click

    page.execute_script("$('#my_button').click();") 相同?

我知道规范结果是一样的,但我真的很想知道:

  • 真正的用户不会使用 JS 浏览器的控制台来点击按钮,所以我们是否应该在规范中不使用 jQuery 来复制它?
  • 规范的性能和速度如何?使用 jQuery 有什么优势吗?

最佳答案

在测试中使用execute_script/evaluate_script 与页面交互并不是模拟真实的用户交互,在很多情况下会使您的测试毫无意义。这样做的主要原因是它允许您做用户永远做不到的事情(更改隐藏/只读/禁用字段的值等)。它也不会生成用户与元素交互时生成的相同事件,因此页面中的 JS 可能不会以相同的方式使用react。 execute_script 确实在编写测试中占有一席之地,但它是有限的,通常用于获取值(而不是更改内容)或解决浏览器/驱动程序中的问题(一旦您完全理解您正在尝试的问题变通并确保这不是用户实际上不能做你想做的事情的情况)。

就速度而言,execute_script 在某些情况下可能会稍微快一些,但这只是因为它没有验证用户是否真的可以做它正在做的事情。此外,稍快但无意义的测试并不能真正为您节省任何东西。

这涵盖了将 execute_script 与 JS 一起使用,我相信这是你的问题真正要问的,尽管你特别提到了 jQuery。在您的测试中确实有的任何 execute_script 调用中不使用 jQuery 还有一个原因,那就是如果您重构您的应用程序以删除 jQuery 并只使用纯 JS,您的测试将会中断。即 - 您可能更喜欢 document.getElementById('abc') 而不是 $('#abc')。这对您来说可能不是什么大问题,因为在您的测试中确实不应该有那么多 execute_script 实例。

TLDR-

check('my_checkbox', option: 1) # best
find("#my_checkbox[value='1']").set(true) # valid but too verbose
page.execute_script("$('#my_checkbox').prop('checked', true);") # Don't use - not replicating a user

click_on('my_button') # best if element is a link or button
find("#my_button").click # valid
find("#my_button").trigger('click') # Only supported on some drivers - don't use in tests unless you REALLY understand why you're using it - basically the same as using `execute_script`
page.execute_script("$('#my_button').click()") # Don't use - not replicating a user

关于jquery - 在 Capybara 测试中使用 jQuery,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51208074/

相关文章:

javascript - 我需要 Javascript 闭包吗?

java - 我如何在 JMockit 中期望和验证相同的方法

javascript - 带有 if 条件 Protractor 的异步 for 循环

ruby - 在 Rspec 中测试抽象类

ruby-on-rails - Capybara Rspec 测试失败可能对 AJAX 造成影响 - 测试 contenteditables

javascript - Vue.js 可以在用户输入数字时添加逗号吗?

javascript - 如何使元素在滚动时仅显示在容器上

testing - 检查 TestCafe 是否正在运行

ruby - 在 Sinatra 应用程序中运行 rspec 只会启动服务器

javascript - 为什么我的函数稍后调用,在显示此警报并显示第一个文档就绪警报之后......?