RSpec: В чем разница между функцией и спецификацией запроса?

113

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

Из документации по характеристикам:

Спецификации функций - это тесты высокого уровня, предназначенные для проверки функциональных возможностей приложения. Они должны управлять приложением только через его внешний интерфейс, обычно веб-страницы.

И для спецификации запроса:

Спецификации запросов предоставляют тонкую оболочку для интеграционных тестов Rails и предназначены для управления поведением всего стека, включая маршрутизацию (предоставляемую Rails) и без заглушек (это зависит от вас). Со спецификациями запроса вы можете:

  • указать единый запрос
  • указать несколько запросов через несколько контроллеров
  • указать несколько запросов в нескольких сеансах

Я знаю, что спецификации функций используют Capybara, а спецификации запросов - нет. Но вряд ли это заслуживает других концепций.

вред
источник

Ответы:

147

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

Технические различия заключаются в том, что спецификации запроса включают интеграционные тесты Rails, а спецификации функций - нет. Это означает, что со спецификациями запроса вы можете использовать методы get, post, put, delete и assert против ответа. Со спецификациями функций вы должны управлять всем взаимодействием через браузер и использовать такие методы, как посещение и подтверждение страницы.

Я бы рекомендовал прочитать feature_spec.feature в исходном коде rspec-rails на github. Надеюсь, это поможет.

Ричард Джордан
источник
2
Итак, вы бы порекомендовали использовать как функции, так и спецификации запросов, или того или другого достаточно? (Быть
новичком
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 03