Моє "ах-ха!" настали моменти про тестування в Ruby and Rails, коли я справді сів і прочитав остаточні ресурси з цього питання, книги Rspec і огірок . Я поділився вашою початковою зневагою до Огірка, але потім зрозумів, що дивлюся на картину з зовсім неправильного кута.
В основному, огірок - це BDD (розвиток, орієнтований на поведінку) - ви використовуєте огірок для планування своїх особливостей, над чим будете працювати далі. Хм, далі ви хочете, щоб користувачі могли рекламувати публікації на форумі чи щось таке (вкрасти приклад;)) Тож ви пишете щось просте.
Given I am logged in
And I can see the post "BDD is awesome"
When I vote the post up
Then the post should have one more vote
And the page should show a message thanking me for my vote.
Зауважте, що там немає посилань ні на що, пов'язане з кодом. Це відбувається у ваших кроках. Коли ви рефакторируете код, можливо, вам доведеться змінити свої визначення кроків, але поведінку (вашу функцію) ніколи не потрібно буде змінювати.
Тепер кожного разу, коли ви запускаєте свою функцію «Огірок», вам дуже важливо пройти тестування функції за допомогою TDD (тестова розробка). Це робиться на нижчому рівні за допомогою RSpec.
Перший запуск - визначення мого першого кроку не визначене. Скопіюйте блок, щоб визначити його в скажімо user_steps.rb або навіть session_steps.rb, оскільки він стосується користувачів та їх сеансів. Тепер, як визначити, що користувач увійшов до системи? Ви можете взяти їх через процес входу.
Given /^I am logged in$/ do
visit login_path
fill_in :name, :with => 'Joe'
fill_in :password, :with => 'Password'
click_button 'submit'
end
Повинні бути всі щасливі. Другий крок.
Given /^I can see the post "(.+)"$/ do |name|
visit post_path(Post.find_by_name(name))
end
Знову досить легко. Зауважте, що якщо ми повністю повторимо процес входу в систему, або як визначені та показані наші пости, нам не доведеться змінювати поведінку. Третій крок.
When /^I vote the post up$/ do
pending
end
Ось де ви починаєте говорити про нові функціональні можливості, але ви не зовсім знаєте, як це все ще буде працювати. Як ви голосуєте за публікацію? Ви можете натиснути на зображення +1 або щось подібне, що виконує публікацію ajax до контролера, який повертає JSON або щось подібне. Тож тепер ви можете перейти до чистого тесту Rspec.
- Перевірте свій погляд, щоб переконатися, що зображення +1 відображається,
- Перевірте свій контролер на правильність поведінки, коли він отримує заданий запит ajax потрібного формату (як щасливі, так і нещасні шляхи - що робити, якщо отримано недійсний ідентифікатор повідомлення? Що станеться, якщо користувач використає свої 25 оновлень за день? Чи правильно вона збільшує кількість голосів?)
- Перевірте свій JavaScript, що він відповідає правильно, коли йому надано крапку JSON у потрібному форматі (чи оновлено зображення +1, щоб показати, що воно було використано? (Маючи на увазі Google+ тут ...) Чи відображається повідомлення подяки? Тощо )
Все це не впливає на поведінку - але коли ви закінчите займатися тестуванням нижчого рівня, буде неправдивим заповнити крок визначення того, як проголосувати за публікацію. Це може бути так само просто click_link '+1'
. А решта кроків - це результати тестування, які знову ж таки повинні бути прості. І коли ви закінчите, то знаєте, що ваша функція завершена і закінчена. Якщо потрібна поведінка зміниться, ви можете налаштувати свою функцію, інакше ви можете налаштувати ваш код реалізації в ідеальній безпеці.
Сподіваюся, це має сенс. Це все було в моїй голові, але я думаю, що це демонструє різницю між BDD і TDD, і чому огірок і RSpec обслуговують різні потреби.