制造商因本地测试数据库老化而生成重复名称

我刚做了一堆测试,结果都失败了,错误类似这样:

 ActiveRecord::RecordInvalid:
       Validation failed: Name has already been taken

看起来问题出在这里:

  fab!(:the_group) { Fabricate(:group) }

这些以前都可以正常工作,直到最近。我在处理另一个插件时也看到了类似的情况,我认为我设法自己设置了一个随机名称,但这些直到昨天都还能正常工作。

是有些东西改变了吗,还是我不小心犯了什么愚蠢的错误?

编辑:在 Claude 和 Discourse Helper Bot 的帮助下,我尝试将上面的 fab 替换为:

  Fabricator(:the_group) do
    name { sequence(:group_name) { |i| "Test Group #{i}" } }
  end

但没能完全弄明白怎么做。

然后我改用了:

  let(:the_group) { Fabricate(:group) }

代替了上面的 !fab,这把失败的数量从 12 减少到了 1,但仍然失败,错误是:

  1) Pfaffmanager::ServersController servers admin can get servers owned by a group
     Failure/Error: let(:the_group) { Fabricate(:group) }

     ActiveRecord::RecordInvalid:
       Validation failed: Name has already been taken

我认为自昨天 CDT 上午 10:30 我最后一次提交以来,这些测试周围没有任何变化。

我回滚到了一个更早的提交,现在失败的错误是:


  1) Pfaffmanager::ServersController servers includes groups that the user is in
     Failure/Error: let(:the_group) { Fabricate(:group) }

     ActiveRecord::RecordInvalid:
       Validation failed: Name has already been taken

然后我再次运行,没有任何更改,现在它在以下测试中失败:

  1) Pfaffmanager::ServersController servers can update group id if group owner
     Failure/Error: let(:the_group) { Fabricate(:group) }

     ActiveRecord::RecordInvalid:
       Validation failed: Name has already been taken

所以看起来它在一个测试中失败了,而且是随机的?

1 个赞

也许您本地的测试数据库处于错误状态?我建议运行:

RAILS_ENV=test bin/rake db:drop db:create db:migrate
3 个赞

天哪。果然是小妖精在捣鬼。

奇怪的是,第一次运行 db:create 没有创建多站点数据库,但当我单独运行 db:create rake 任务时,它就创建了。然后迁移成功了,然后它就正常工作了。

@Lilly,你和你的 :eyes: 让我笑翻了。

我明白了,所以就像我之前那个测试数据库放了很久,然后随机生成的名称开始与之前的名称冲突。现在说得通了。我修改了我的升级脚本(它会执行 git pull,从 all-the-plugins 刷新代码,检查 ruby 版本等等),使其能够删除、创建、迁移测试数据库。

4 个赞

哈哈。好吧,我一直在盯着你的代码片段看,因为我非常确定它应该能正常工作,因为:

2 个赞

理论上,测试数据库应该在每次测试运行后自动清理。所以它不应该处于这种状态。但是……如果测试进程因为某种原因被异常终止了,我认为清理(技术上讲,是恢复一个pg savepoint)可能会被跳过。

所以这不应该是一个正常情况。就我个人而言,只有当我开始遇到奇怪的失败时,我才会费事去执行 drop/create/migrate。

但是,如果你不介意等待,定期重新创建你的测试数据库也没有坏处 :+1:

3 个赞

这说得通。我喜欢 ^c

我讨厌等待。我会注释掉它,希望我能记住。 :slight_smile:

再次感谢你弄清楚了这个问题。我确信我疯了。

2 个赞

此主题在上次回复后 30 天自动关闭。不再允许回复。