Слабые тесты Websockets после обновления до Rails 6 - PullRequest
0 голосов
/ 30 апреля 2020

При обновлении приложения среднего размера с Rails 5.1 до 6.0.2.2 (+ Ruby 2.6.1 -> 2.6.3) я начинаю получать нестабильные тесты во всех видах тестов. Покрытие 90%, 500 сотен тестов и от 0 до 8 неудачных тестов, абсолютно случайные. После долгой охоты на ошибки я заметил, что у меня все работает со 100% уверенностью, если я пропущу все тесты, связанные с Websocket.

Обычно это то, что я должен тестировать и как я это делаю (Minitest / Spe c синтаксис):

class Api::PlayersControllerTest < ActionController::TestCase
  before do
    @user = users(:admin)
    sign_in @user
  end

  it "broadcasts stop to user's player" do
    put :update, format: :json, params: {id: @user.id}

    assert_broadcast_on("PlayersChannel_#{@user.id}", action: "stop")
  end
end

Обратите внимание, что это не "интеграционный тест", потому что мы используем сырой вызов API. Что я должен проверить: если какой-то запрос поступает на какой-либо контроллер, ActionCable передает сообщение Websocket. Вот почему я должен использовать помощник Devise sign_in в тесте контроллера.

  • ActionCable поддерживается Redis во всех средах.
  • Я не использую Параллельное тестирование.
  • Набор данных использует фикстуры, а не фабрики.
  • use_transactional_tests имеет значение true

У меня 23 подобных теста, и все они без проблем проходили с использованием Rails 5.1. Начинаются один за другим с использованием фокуса, они также проходят 100% как в Rails 5, так и в 6. Проблема заключается в том, что при выполнении всего набора тестов у меня начинают появляться ошибки во всех разделах (включая тесты модулей / моделей), в основном связанных с согласованность набора данных. На самом деле, похоже, что приборы не (или плохо) перезагружаются.

Есть идеи? Что-то не так с тем, что я делаю, или вы думаете, что это проблема с Rails 6?

1 Ответ

0 голосов
/ 30 апреля 2020

Хорошо, решено добавлением Gem очистителя базы данных. Довольно любопытно, что он работает с использованием той же стратегии ": транзакция", которая используется для управления остовами Rails ... но в любом случае это работает!

...