Когато използвам capybara-webkit или poltergeist за тестване на поведението на JavaScript, често намирам (или за съжаление пиша) тестове, които изглеждат така
it "saves the check box value when clicked", js: true do
visit '/somewhere'
page.should have_unchecked_field 'cool_check_box'
page.check 'cool_check_box'
visit '/somewhere'
page.should have_checked_field 'cool_check_box'
end
... където поставянето на отметка в квадратчето прави някаква AJAX заявка, която запазва каквото и да е състояние, което позволява да бъде проверено след бързо презареждане.
Този тест изглежда гарантирано неуспешен, защото ако AJAX заявката не завърши до момента, в който се случи второто visit '/somewhere'
, тя ще се зареди с квадратчето за отметка в грешно състояние.
За щастие на тази страница има и спинер, който се върти, докато заявката за отметка се изпълнява, така че мога да променя теста така
it "saves the check box value when clicked", js: true do
visit '/somewhere'
page.should have_unchecked_field 'cool_check_box'
page.check 'cool_check_box'
# Wait for checkbox ajax to complete
page.should have_css('.spinner:not(.active)')
visit '/somewhere'
page.should have_checked_field 'cool_check_box'
end
Все още съм малко параноичен обаче: ако редът page.check
се изпълняваше, но не успя да настрои въртящия се active
преди реда page.should have_css
, този ред щеше да успее, преди заявката дори да започне.
Като се има предвид, че JavaScript, задействан от квадратчето за отметка, задава класа active
, мога ли да гарантирам, че този тест никога няма да се отклони?