Как написать тест rspec для тестированя контроллера на race conditions?

Добрый день всем, прошу помощи. Как написать тест для приложения на RoR в котором я хочу протестировать отсутствие race conditions в экшене контроллера. Читал статью Testing race conditions in your Rails app, написанную Robert Pankowecki. Получилось буквально следующее:
describe Cabinet::Balance::BalanceController do
        render_views
        controller_methods = [{name: :prolongation, method: 'POST', params: {}}]
        describe 'prolongation action' do
                it 'ловим двойное списание средств' do
                        active_adv = FactoryBot.create :active_adv
                        active_adv.touch :expired_at
                        active_adv.save

                        user = active_adv.user
                        user.amount = PriceList.prolongation.price
                        user.save
                        # Логинимся, продлеваем объявление
                        login_user user


                        threads = 2.times.map do |i|
                                Thread.new do
                                        request.env["HTTP_ACCEPT"] = 'application/json'
                                        post :prolongation, :params => {id: active_adv.id}
                                        expect(response).to have_http_status :ok
                                end
                        end
                    threads.each(&:join)
                end
        end
end

Проблема началась в тот момент, когда я начал отсылать post запросы в теле thread. Я начал получать ошибки разного рода. Сейчас вспоминаю одна гласила, что я вызываю функцию render два раза, вторая: Circular dependency detected while autoloading constant DeviseController.
Потом я находил на форумах, что отладка контроллеров таким образом не допустима и что нужно логику из контроллера убирать и тестировать не контроллер. Правда ли это? Логику не хочется перекладывать из контроллера в другие места. Делал ли кто нибудь такие тесты? Получилось? Как сделали?

PS Ответ того же Robert Pankowecki в комменариях stackoverflow на подобный вопрос:
The blog post was written for testing models/service objects. I am not sure if controllers tests are thread-safe in Rails. If there are many requests which request/response do you expect to be testing? It might be easier for you to test this logic if you extract non-http related concerns to a service and test that without doing HTTP requests
. – Robert Pankowecki
  • Вопрос задан
  • 464 просмотра
Пригласить эксперта
Ответы на вопрос 1
@kaasmith
В статье он тестирует race condition на примере доступа к базе.
Вот эта строчка, очень важна, она как раз про пул подключений к бд.

expect(ActiveRecord::Base.connection.pool.size).to eq(5)

В контролере я бы не стал тестировать эту логику, у вас там и не должно быть бутылочного горлышка. А вот в базе может быть. Сделайте сервисный объект или перенесите логику в модель и тестируйте там.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы