Я только что столкнулся с проблемой, которая подтолкнула меня к этому вопросу. Принятое решение привело меня к более эффективной реализации с rack-test 0.6.3
.
Я вручную создал . / Spec / helpers / rspec_http_request_override_helper.rb
module RspecHttpRequestsOverrideHelper
def get(uri, params = {}, env = {}, &block)
super(uri, params, set_json_headers(env), &block)
end
def post(uri, params = {}, env = {}, &block)
super(uri, convert_to_json(params), set_json_headers(env), &block)
end
def put(uri, params = {}, env = {}, &block)
super(uri, convert_to_json(params), set_json_headers(env), &block)
end
def delete(uri, params = {}, env = {}, &block)
super(uri, convert_to_json(params), set_json_headers(env), &block)
end
# override other HTTP methods if necessary
private
def set_json_headers(env={})
env.merge({'ACCEPT' => "application/json", 'CONTENT_TYPE' => 'application/json'}) unless env.nil?
end
def convert_to_json(params={})
params.to_json unless params.nil?
end
end
Затем я добавил ниже к моему spec_helper.rb
# require assuming project root is loaded into ruby's class paths
require './spec/helpers/rspec_http_request_override_helper'
RSpec.configure do |config|
config.include RspecHttpRequestsOverrideHelper
# Other settings
end
И это было все!
Примечание : Приведенный выше метод get
не намеренно преобразует значение params в json. Значения параметров кодируются в строку запроса и затем отправляются. Не является частью тела HTTP в запросе, хотя метод GET
http поддерживает отправку тела; подробности см. Здесь .
Моя проблема заключалась в том, что помощники по тестированию rspec для создаваемого мной API преобразовывали логические типы в строковые типы при отправке запроса в API. Оказывается, если вы не указали заголовок типа содержимого для json
, данные передаются как multipart/form-data
или x-www-form-urlencoded
в зависимости от метода HTTP; подробности см. Здесь . Это преобразовывало мои специальные типы данных, которые действительны в json, как целые и логические значения, в строки. И фактически мне нужно преобразовать их на конце API. Только когда я добавил проверку для ввода в мой API, это было выставлено. Yay для проверок и испытаний!
Теперь мне нужно было эффективно применить заголовок типа контента ко всем моим запросам и преобразовать параметры в json при отправке запросов; Я вызывал методы http со значением params, являющимся хэшем ruby. У меня более 200 тестов, поэтому их изменение вручную не было бы оптимальным решением. Поэтому я реализовал приведенное ниже решение. Который работает очень хорошо.
Я решил придерживаться того же определения метода, что и для стоечного теста, и тогда я мог эффективно вызывать super после редактирования запросов.
Мои неудачные тесты теперь начали проходить, и мои предыдущие тесты, где ни один мудрее
Надеюсь, это поможет другим, кто сталкивается с подобной проблемой.