当我把一个中等规模的应用从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。
我有23个像这样的测试,以前用Rails 5.1都能顺利通过。使用focus逐一开始,它们在Rails 5或6中也都是100%通过。问题是当执行整个测试套件时,我开始在所有的部分(包括UnitModels测试)都出现松动,主要是与数据集一致性有关。实际上,它看起来像是固定装置没有(或者说重载得不好)。
有什么想法吗?是我做的事情出了问题,还是你认为是Rails 6的问题?
好吧,通过添加数据库清理宝石解决了。很奇怪,它的工作原理与Rails裸体夹具管理中使用的":transaction "策略相同......但无论如何,它是有效的!