自動マイグレーションによるテストデータベーススキーマ

関連: Db:drop, create & migrate behavior with RAILS_ENV=development - #2 by taylorthurlow - A May Of WTFs - Ruby on Rails Discussions

以前にこの点について検討したかどうかはわかりませんが、Rails は ActiveRecord::Migration.maintain_test_schema! を使用してテストデータベースのスキーマを自動的に維持できます(メソッド定義rails/test_help、最新の rspec/rails ヘルパージェネレーター内)。

Discourse の spec/rails_helper にこれを組み込むための diff は以下の通りです:

ただし、私の Docker ベースの開発環境では失敗します:

ActiveRecord::StatementInvalid: PG::InsufficientPrivilege: ERROR:  must be owner of database discourse_test

これは、maintain_test_schema!db:test:prepare を利用し、最初にテストデータベースを削除しようとするためです。Docker ベースの環境では、discourse ユーザーにその権限がないと思われます。

ネイティブな開発環境をお持ちの方は、試していただけませんか?もし動作すれば、この変更を検討する価値があるかもしれません。

「いいね!」 8

その差分を適用し、データベースを削除してから
bin/rails db:create
bin/rails db:migrate
を実行しました。

その後、ランダムな仕様の一つを選びました

▶ bundle exec rspec spec/requests/permalinks_controller_spec.rb 
./spec/requests/permalinks_controller_spec.rb の読み込み中にエラーが発生しました。
Failure/Error: Group.find_by(id: id)

ActiveRecord::StatementInvalid:
  PG::UndefinedTable: ERROR:  relation "groups" does not exist
  LINE 8:  WHERE a.attrelid = '"groups"'::regclass
                              ^
# ./app/models/group.rb:532:in `lookup_group'
# ./app/models/group.rb:516:in `block in ensure_automatic_groups!'
# ./app/models/group.rb:515:in `each_key'
# ./app/models/group.rb:515:in `ensure_automatic_groups!'
# (eval):3:in `block (2 levels) in run_file'
# ./spec/rails_helper.rb:79:in `<top (required)>'
# ./spec/requests/permalinks_controller_spec.rb:3:in `require'
# ./spec/requests/permalinks_controller_spec.rb:3:in `<top (required)>'
# ------------------
# --- Caused by: ---
# PG::UndefinedTable:
#   ERROR:  relation "groups" does not exist
#   LINE 8:  WHERE a.attrelid = '"groups"'::regclass
#                               ^
#   ./app/models/group.rb:532:in `lookup_group'
サンプルが見つかりませんでした。


完了まで 0.00003 秒(ファイルの読み込みに 1.6 秒要しました)
0 サンプル、0 失敗、サンプル外で 1 件のエラーが発生しました

config.before('suite') には一度も到達しませんでした。

「いいね!」 3