ruby-on-rails - 升级到 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 消息。这就是为什么我必须在控制器测试中使用设计登录助手。
- ActionCable 在所有环境中都由 Redis 提供支持。
- 我不使用并行测试。
- 数据集使用的是夹具,而不是工厂。
- use_transactional_tests 设置为 true
我有 23 个像这样的测试,它们都过去使用 Rails 5.1 没有任何问题通过。使用焦点一一开始,它们在 Rails 5 或 6 中也都通过了 100%。问题是在执行整个测试套件时,我开始在所有部分(包括单元/模型测试)中变得脆弱,主要与数据集一致性。实际上,看起来固定装置没有(或很差)重新加载。
有任何想法吗?我正在做的事情有问题,还是您认为这是 Rails 6 的问题?
解决方案
好的,通过添加 Database Cleaner Gem 解决。很好奇它使用与 Rails 准系统夹具管理相同的“:transaction”策略工作......但无论如何,它工作!
推荐阅读
- c# - 在 VS 中调试时可以跳到循环的第 i 次迭代吗?
- stenciljs - 模板编译器是否忽略了某些文件?
- r - 更新到新的 R 版本后代码不起作用
- angular - Angular - 从父类调用子组件函数
- scala - 为什么 Semigroup 有 Option 类型并且表现得像 Monoid 中的中性元素?
- java - JOOQ + JPA 实体
- python - 使用两个迭代列表和 'in range (0,len a_list)) 查找点之间的最小距离
- reactjs - 使用 CSS 隐藏反应选择菜单
- c++ - 实例化抽象类,然后用特定的派生类重新声明?
- python - 无法理解 write() 格式(它是如何工作的)