Контекст : приложение использует часть промежуточного программного обеспечения Rack, которое должно быть установлено в config.ru, а не внутреннюю цепочку промежуточного программного обеспечения Rails. Это происходит по причинам, не относящимся к данному вопросу.
Вопрос : как мне сделать мои тесты (функциональные и интеграционные) осведомленными об этом промежуточном программном обеспечении?
Я приведу пример. Давайте создадим безупречное приложение Rails 3, используя перезапись стойки в целях иллюстрации.
# /config/initializers/example.rb
Rails.application.middleware.insert 0, 'Rack::Rewrite' do
r301 '/so', 'http://stackoverflow.com'
end
# /test/integration/the_test.rb
require 'test_helper'
class TheTest < ActionDispatch::IntegrationTest
test "redirect from /so to http://stackoverflow.com" do
get '/so'
assert_redirected_to 'http://stackoverflow.com'
end
end
Если вы запустите вышеуказанный тест, все будет хорошо, и с помощью браузера вы можете подтвердить, что посещение пути / so
действительно перенаправит вас в StackOverflow.
Круто, давайте теперь настроим это вне Rails. Удалите описанный выше файл /config/initializers/example.rb
и измените config.ru
на следующее:
# /config.ru
require ::File.expand_path('../config/environment', __FILE__)
map '/so' do
run Rack::Rewrite do
r301 '', 'http://stackoverflow.com'
end
end
map '/' do
run Deleteme::Application
end
Теперь тест перестанет работать. Функциональность действительно работает, что подтверждается посещением / so
в своем браузере. Просто тесты не знают об этой настройке стойки.