Добрый день всем, прошу помощи. Как написать тест для приложения на 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