Использование jQuery в тестах Capybara - PullRequest
0 голосов
/ 06 июля 2018

Я хотел бы спросить ваше мнение об использовании jQuery в спецификациях Capybara. Это действительно имитирует реальное взаимодействие с пользователем , или это фальшивка это?

  • Использует 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?

1 Ответ

0 голосов
/ 06 июля 2018

Использование execute_script / evaluate_script для взаимодействия со страницей в ваших тестах НЕ симулирует реальное взаимодействие с пользователем и во многих случаях может сделать ваши тесты бессмысленными.Основная причина этого заключается в том, что он позволяет делать то, что пользователь никогда не мог (изменение значений скрытых / только для чтения / отключенных полей и т. Д.).Он также не генерирует те же события, которые генерирует пользователь, взаимодействующий с элементами, поэтому JS на вашей странице может не реагировать одинаково.execute_script имеет свое место в написании тестов, но оно ограничено и обычно позволяет получать значения (в отличие от меняющихся вещей) или обходить проблемы в браузерах / драйверах (когда вы полностью понимаете проблему, которую пытаетесь обойти иконечно, это не та ситуация, когда пользователь на самом деле не может делать то, что вы пытаетесь сделать).

Что касается скорости, то в некоторых случаях execute_script может быть немного быстрее, но это только потому, что это не означает, что пользователь действительно может делать то, что он делает.Также немного более быстрый, но бессмысленный тест на самом деле ничего не спасает.

Это касается использования execute_script с JS, что, как я полагаю, действительно задает ваш вопрос, хотя вы специально упомянули jQuery.Существует также причина не использовать jQuery в любых вызовах execute_script, которые у вас есть в ваших тестах, а именно: если вы когда-нибудь проведете рефакторинг своего приложения, чтобы удалить 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
...