在 Capybara 测试中使用 jQuery

Using jQuery in Capybara tests

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

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

在测试中使用 execute_script/evaluate_script 与页面交互并不是模拟真实的用户交互,在很多情况下会使您的测试毫无意义。这样做的主要原因是它允许您做用户永远做不到的事情(更改 hidden/readonly/disabled 字段的值等)。它也不会生成用户与元素交互时生成的相同事件,因此页面中的 JS 可能不会以相同的方式做出反应。 execute_script 确实在编写测试中占有一席之地,但它是有限的,通常用于获取值(而不是改变事物)或解决 browsers/drivers 中的问题(一旦你完全理解了你正在尝试的问题)解决并确保这不是用户实际上无法执行您正在尝试执行的操作的情况)。

就速度而言,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