스펙과 픽스처 이해하기

일부 그룹을 시드(seed)해야 하는 플러그인을 개발 중입니다.

https://meta.discourse.org/t/how-to-add-new-webhooks-and-customize-webhook-payload/59609에 따라 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를 별도로 실행하지 않는 한 마이그레이션이 수행되지 않습니다. 이것이 예상된 동작인가요? 마이그레이션까지 수행될 것으로 생각했습니다.

위와 같이 테스트 DB 마이그레이션을 수행한 후에도 여전히 혼란스럽습니다. 다음 오류가 발생하기 때문입니다.

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

마이그레이션을 실행할 때 다음과 같은 로그도 확인했습니다.

-- execute("UPDATE groups\nSET flair_icon = 'fab-youtube'\nWHERE flair_icon = 'youtube-play' OR flair_icon = 'fa-youtube-play'\n")

결국,

./bin/rake db:test:prepare

를 실행하니 문제가 해결되었습니다. 하지만 이전에 이렇게 해야 했다는 기억이 나지 않습니다.

2개의 좋아요