В настоящее время у меня возникли проблемы с отслеживанием того, что не так с заданными мною спецификациями. Для моего Rails API я добавил приятную проблему, которая добавляет индекс при возникновении ошибок. Концерн работает нормально, и у меня нет проблем с этим! На моей локальной машине тесты работают нормально. В CI 9/10 раз тесты проходят, но в 1/10 раза тесты не выполняются.
Мой файл spe c выглядит следующим образом:
RSpec.describe Api::IndexedErrors, type: :controller do
describe 'with concern included' do
controller(ActionController::API) do
include Api::IndexedErrors
def index
user = User.create(signup_answers: [SignupAnswer.new(signup_question_id: 3)])
render(json: user.errors)
end
end
describe 'indexed errors' do
before { get :index }
it { expect(JSON.parse(subject.response.body)).to include('signup_answers[0].signup_question' => ['must exist']) }
end
end
describe 'without concern included' do
controller(ActionController::API) do
def index
user = User.create(signup_answers: [SignupAnswer.new(signup_question_id: 3)])
render(json: user.errors)
end
end
describe 'indexed errors' do
before { get :index }
it { expect(JSON.parse(subject.response.body)).to include('signup_answers.signup_question' => ['must exist']) }
end
end
end
Первый тест имеет Api :: IndexedErrors включен, а второй нет. Чтобы проверить работу индексации, я добавил оба возможных случая. Моя проблема выглядит следующим образом:
module Api
module IndexedErrors
extend ActiveSupport::Concern
included do
# This enables records with has_many relations on nested_attributes to return indexed errors
# Used to show exactly which records have errors, only set it for API calls
around_action :set_index_errors
end
private
def set_index_errors
original = ActiveRecord::Base.index_nested_attribute_errors
ActiveRecord::Base.index_nested_attribute_errors = true
yield
ensure
ActiveRecord::Base.index_nested_attribute_errors = original
end
end
end
9/10 случаев, когда пройдет последняя (вторая) секунда, но при неудачном тесте запрос json был искажен.
Как json ответ должен быть следующим:
signup_answers.signup_question' => ['must exist']
Что на самом деле отображается во время нестабильного теста:
signup_answers[0].signup_question' => ['must exist']
Кто-нибудь из вас знает, почему эта индексация была добавлена? Я делаю что-то не так с рендерингом JSON?