了解规格和固定装置

我有一个插件需要初始化一些群组。

按照 Add new webhooks and customize webhook payload 的指引,我在 plugin.rb 中添加了:

SeedFu.fixture_paths << Rails.root.join("plugins", "discourse-pfaffmanager", "db", "fixtures").to_s

db/fixtures/001_create_pfaffmanager_groups 中我有如下内容:

Group.seed do |g|
  g.name = SiteSetting.pfaffmanager_ec2_pro_server_group
  g.visibility_level = Group.visibility_levels[:owners]
end

如果我运行 ./bin/rake db:migrate,它能按预期工作;但运行测试时却报错:

#   ERROR:  duplicate key value violates unique constraint "index_groups_on_name"

看来测试似乎会重复运行这些种子数据?这不太合理,因为如果重新运行迁移,它们并不会报错。

也许我应该把这些测试移到 spec/fixtures,并让插件在启动时创建这些群组?这是最佳实践吗?我觉得通过迁移创建这些群组比在每次插件启动时用 Group.find_or_create_by 断言它们更好,不过后者目前也能正常工作。

另外,运行 ./bin/rake db:drop db:create db:migrate 似乎会创建测试数据库,但除非我执行 RAILS_DB=test ./bin/rake db:migrate,否则不会执行迁移。这是预期的行为吗?我以为它会自动执行这些迁移。

现在我更困惑了:即使在上述测试数据库迁移之后,我仍然遇到以下错误:

ActiveRecord::StatementInvalid:
  PG::UndefinedTable: ERROR:  relation "groups" does not exist
  LINE 8:  WHERE a.attrelid = '"groups"'::regclass

而在运行迁移时,我看到了类似这样的内容:

-- execute("UPDATE groups
SET flair_icon = 'fab-youtube'
WHERE flair_icon = 'youtube-play' OR flair_icon = 'fa-youtube-play'
")

后来我执行了:

./bin/rake db:test:prepare

问题就解决了,但我记得以前不需要这样做。

2 个赞