Для совместного тестирования контроллера и представлений вы пишете характеристики объекта и спецификации запроса .
Характеристики запроса спецификации нижнего уровня, где вы отправляете HTTP-запросы в ваше приложение и записываете ожидания (или утверждения в TDD lin go) об ответе. Они являются оберткой вокруг ActionDispatch::IntegrationTest
. Спецификации запроса следует рассматривать как замену спецификаций контроллера, использование которых не поощряется командами RSpe c и Rails.
# spec/requests/products_spec.rb
require 'rails_helper'
RSpec.describe "Products", type: :request do
describe "GET /products" do
let!(:products) { FactoryBot.create_list(:product, 4) }
it "contains the product names" do
get "/products"
expect(response).to include products.first.name
expect(response).to include products.last.name
end
end
end
Спецификации функций - это спецификации более высокого уровня, ориентированные на историю пользователя. Они часто служат приемочными испытаниями. Они используют браузерный симулятор под названием Capybara, который эмулирует пользователя, просматривающего приложение. Capybara также может запускать безголовые браузеры (безголовые chrome, firefox, фантомные js, webkit et c) и "настоящие" браузеры через селен. Минимальный эквивалент - ActionDispatch::SystemTestCase
, но функции RSpe c не включают его (потребовались годы минимума / тестового блока, чтобы его догнать).
# Gemfile
gem 'capybara'
# spec/features/products_spec.rb
require 'rails_helper'
RSpec.feature "Products" do
let!(:products) { FactoryBot.create_list(:product, 4) }
scenario "when a user views a product" do
visit '/'
click_link 'Products'
click_link products.first.name
expect(page).to have_content products.first.name
expect(page).to have_content products.first.description
end
end
Эта спецификация тестирует продукты # index и products # show action, а также страница root и связанные представления.
Оба типа спецификаций имеют свои сильные и слабые стороны. Функциональные тесты хороши для тестирования больших областей приложения, но тяжелы. Спецификации запросов быстрее и проще реплицировать специфический c запрос, который вызывает ошибку / проблему, но вы в основном просто сопоставляете HTML с регулярными выражениями, которые сильно ограничены.