RSpec: Чим відрізняється функція від специфікації запиту?


113

Що таке концептуальне розходження між Rspec в художній специфікації і запит специфікації ?

З специфікацій функцій:

Технічні характеристики - це тести високого рівня, призначені для використання фрагментів функціональності через додаток. Вони повинні керувати програмою лише через її зовнішній інтерфейс, як правило, веб-сторінки.

А для специфікації запиту:

Характеристики запиту забезпечують тонку обгортку навколо інтегральних тестів Rails та призначені для керування поведінкою через повний стек, включаючи маршрутизацію (надається Rails) та без заглушок (це залежить від вас). За допомогою специфікацій запиту ви можете:

  • вкажіть один запит
  • задайте кілька запитів у кількох контролерах
  • задайте кілька запитів протягом декількох сеансів

Я знаю, що технічні характеристики використовують Capybara, а специфікації запитів - ні. Але це навряд чи заслуговує різних концепцій.

Відповіді:


147

Концептуальна відмінність полягає в тому, що ви зазвичай тестуєте історію користувача, і вся взаємодія повинна керуватися через користувальницький інтерфейс. Ось тут приходить Capybara. Спеціалізація запиту все ще перевіряє поведінку вашої заявки і не очікує читабельності, яку матиме тест прийняття. Отже, особливість є вдосконаленим синтаксисом для приймальних тестів.

Технічні відмінності включають специфікації запитів, які обгортають тести інтеграції рейок, тоді як характеристики характеристики не відповідають. Це означає, що в специфікаціях запиту ви можете використовувати методи get, post, put, delete та затверджувати проти відповіді. Завдяки специфікаціям функцій слід керувати всією взаємодією через браузер та використовувати такі методи, як відвідування та затвердження сторінки.

Я рекомендую прочитати особливість feature_spec.feature у вихідному коді rspec-rails на github. Я сподіваюся, що це допомагає.


2
Тож чи рекомендуєте ви використовувати як функцію, так і специфікацію запиту, або одного чи іншого достатньо? (Будучи новим у TDD ...)
robertwbradford

2
Я використовую обидва, @robertwbradford. Я використовую технічні характеристики для того, щоб виїхати назовні на тести - тестування користувальницької роботи, а потім розробка функціональних можливостей за допомогою тестів на одиниці. Я використовую запит функції для тестування відповідей - наприклад , в sessions_spec я можу мати описати "GET /login"блок з очікуваннями в itблоках , таких як expect(response.status).to eq(200)і expect(response).to render_template(:new), або в describe "POST /sessions", в context "with valid credentials"блоці, з expect(response).to redirect_to(user)іfollow_redirect!; expect(response.body).to include("Signed in")
Річард Йорданії

5
І ви також використовуєте специфікації контролера? Здається, є дублювання між тим, що ви тестуєте в специфікаціях запиту, і тим, що зазвичай тестується в специфікаціях контролера.
Ернесто

5
Сказавши це, вищезгаданий посилання чітко описує відмінності. Використовуйте специфікації запитів для тестування через API, використовуйте специфікації функцій для тестування через фронтенд.
Демієн Рош

2
@RichardJordan: Запитання: Чи рекомендуєте ви в специфікаціях функцій використовувати шляхи Rails (тобто visit users_path) або рядки з твердим кодом ( visit '/users') ?. Особисто я вважаю за краще не використовувати будь-які внутрішні програми в таких специфікаціях.
tokland
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.