最近Rails::Engine
、テストを実行するための「ダミー アプリケーション」を含むモジュールを gem に抽出しました。 rake spec
動作が異なり、いくつかの仕様が失敗する原因となっています。
まず、rake spec --trace
gem ディレクトリで実行しても、この長い呼び出しチェーンが発生しなくなりました。
** Invoke spec (first_time)
** Invoke test:prepare (first_time)
** Invoke db:test:prepare (first_time)
** Invoke db:abort_if_pending_migrations (first_time)
** Invoke environment (first_time)
** Execute environment
** Invoke db:load_config (first_time)
** Execute db:load_config
** Execute db:abort_if_pending_migrations
** Execute db:test:prepare
** Invoke db:test:load (first_time)
** Invoke db:test:purge (first_time)
** Invoke environment
** Invoke db:load_config
** Execute db:test:purge
** Execute db:test:load
** Invoke db:test:load_schema (first_time)
** Invoke db:test:purge
** Execute db:test:load_schema
** Invoke db:schema:load (first_time)
** Invoke environment
** Invoke db:load_config
** Execute db:schema:load
** Execute test:prepare
** Execute spec
代わりに、次のように呼び出します。
** Invoke spec (first_time)
** Execute spec
RSpec::Core::RakeTask に DB の初期化を行うコードが見当たりません。したがって、これは Rakefile によって Rails ルート ディレクトリに追加された Rails 関数に違いありません。
これを追加して対処することを検討しました:
task :my_spec do
ENV['RAILS_ENV'] = 'test'
Rake::Task['db:drop'].invoke
Rake::Task['db:create'].invoke
ENV['SCHEMA'] = '/Users/me/sandbox/my_app/db/schema.rb'
Rake::Task['db:schema:load'].invoke
Rake::Task['spec'].invoke
end
しかし、これらのタスクはいずれも、gem のルートにある Rakefile によってロードされません。
rake spec
このディレクトリからテスト DB を初期化するにはどうすればよいですか?
第 2 に、rspec はテスト間で DB をクリアしなくなりました。そのため、元の DB 状態に依存するテストは現在失敗しています。おそらくこれは、私がテストを間違って書いていることを意味しますが、テスト出力を理解する際に、テストの「白紙の状態」のアイデアが役立つと考えています。
rake spec
通常のRailsアプリの場合と同様に、テストの合間にDBをクリアするにはどうすればよいですか?