升级到Rails 6后,Websockets的测试出现了问题。

问题描述 投票:0回答:1

当我把一个中等规模的应用从Rails 5.1升级到6.0.2.2(+ Ruby 2.6.1 -> 2.6.3)的时候,我开始在所有类型的测试中得到片状测试。90%的覆盖率,500百个测试,0到8个测试失败,完全是随机的。经过长时间的bug查找,我注意到,如果跳过所有Websocket相关的测试,我就能以100%的信心获得一切工作。

这就是典型的我要测试的内容和我的做法(MinitestSpec语法e)。

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 helper。

  • ActionCable是由Redis支持的,在所有环境中。
  • 我不使用并行测试。
  • Dataset是使用Fixtures,而不是工厂。
  • use_transactional_tests被设置为true。

我有23个像这样的测试,以前用Rails 5.1都能顺利通过。使用focus逐一开始,它们在Rails 5或6中也都是100%通过。问题是当执行整个测试套件时,我开始在所有的部分(包括UnitModels测试)都出现松动,主要是与数据集一致性有关。实际上,它看起来像是固定装置没有(或者说重载得不好)。

有什么想法吗?是我做的事情出了问题,还是你认为是Rails 6的问题?

ruby-on-rails minitest ruby-on-rails-6
1个回答
0
投票

好吧,通过添加数据库清理宝石解决了。很奇怪,它的工作原理与Rails裸体夹具管理中使用的":transaction "策略相同......但无论如何,它是有效的!

© www.soinside.com 2019 - 2024. All rights reserved.