2

最近Rails::Engine、テストを実行するための「ダミー アプリケーション」を含むモジュールを gem に抽出しました。 rake spec動作が異なり、いくつかの仕様が失敗する原因となっています。

まず、rake spec --tracegem ディレクトリで実行しても、この長い呼び出しチェーンが発生しなくなりました。

** 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をクリアするにはどうすればよいですか?

4

0 に答える 0