首页 > 解决方案 > 升级到 Rails 6 后的 Websockets 不稳定测试

问题描述

在将中型应用程序从 Rails 5.1 升级到 6.0.2.2(+ Ruby 2.6.1 -> 2.6.3)时,我开始在各种测试中得到不稳定的测试。90% 的覆盖率,500 次数百次测试,0 到 8 次测试失败,完全随机。经过长时间的 bug 搜寻,我注意到如果我跳过所有与 Websocket 相关的测试,我可以 100% 自信地完成所有工作。

这通常是我必须测试的以及我是如何做的(Minitest/Spec 语法):

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 消息。这就是为什么我必须在控制器测试中使用设计登录助手。

我有 23 个像这样的测试,它们都过去使用 Rails 5.1 没有任何问题通过。使用焦点一一开始,它们在 Rails 5 或 6 中也都通过了 100%。问题是在执行整个测试套件时,我开始在所有部分(包括单元/模型测试)中变得脆弱,主要与数据集一致性。实际上,看起来固定装置没有(或很差)重新加载。

有任何想法吗?我正在做的事情有问题,还是您认为这是 Rails 6 的问题?

标签: ruby-on-railsminitestruby-on-rails-6

解决方案


好的,通过添加 Database Cleaner Gem 解决。很好奇它使用与 Rails 准系统夹具管理相同的“:transaction”策略工作......但无论如何,它工作!


推荐阅读