RSpe c нестабильный тест на индексацию ошибок валидации - PullRequest
0 голосов
/ 22 апреля 2020

В настоящее время у меня возникли проблемы с отслеживанием того, что не так с заданными мною спецификациями. Для моего 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?

...