2016-10-25 10 views
4

同じデータベースを使用する2つのRailsアプリケーションがあります。 1つのアプリケーションが移行によってデータベースを管理していますが、もう1つはアクセスしているだけです。rspecがテスト前にテストデータベースを削除するのを止める方法

何らかの理由で、データベースを管理していないアプリでRSpecでテストを実行すると、テストを実行する前にデータベースが削除されます。しかし、このアプリはデータベースを再作成する方法を知らないので、すべてのテストが失敗します。

RSpecにデータベースを削除しないように指示するにはどうすればいいですか?

答えて

6

データベースを移行する必要がない場合は、再定義することができrspecsレール spec:prepareタスクこのような:

lib/tasks/patch_rspec_rails.rb

Rake::Task["spec:prepare"].clear 
namespace :spec do 
    task :prepare do 
    ENV['RACK_ENV'] = ENV['RAILS_ENV'] = 'test' 
    end 
end 

spec:prepareタスクは、DBをセットアップされ、test:prepareを呼び出します。

Rails 4.0(またはそれ以前の場合)以降のタスクtest:prepareが存在します。このタスクは、Rails 5.0内にも存在します。鉄道がテスト依存の設定を追加するのは難しいことです。その定義はrake -W test:prepareで確認できます。その タスクがヒットした場合はrake --trace specで確認できます。

ActiveRecord uses this task移行状態を確認し、dbを設定します。

このタスクが呼び出されないと、dbは削除されず、作成されません。

しかし、他の宝石がフックとしても使用されている場合、テストにプラグインすると機能しません。

編集:

Railsの4.1ので、あなたはconfig/environments/test.rbconfig.active_record.maintain_test_schema = falseを設定することができます。このようにして、Railsはテストスキーマを移行する必要がなくなりました。

+0

私はあなたのソリューションをよりよく理解しようと考えていますが、実際にデータベースが落とされるのをどうやって防ぐのか、そしてschema.rbが存在しないために再作成に失敗するのはちょっと混乱します。私が集めることから、Rake :: Task ["test:prepare"]。invoke'への呼び出しを削除します。これは単にマイグレーションを実行し、そのタスクが宣言されている場合のみです - pre Rails 4.1.0を意味します。 Rails 4.1.0以降では、呼び出しは行われません。 – David

+0

Rails 4以前では、タスク 'test:prepare'がフックとして存在します(https://github.com/rails/rails/blob/4-0-stable/railties/lib/rails/test_unit/testing.rake# L66)。 Rails 5では、このタスクも存在します(rake -W test:prep)。 ActiveRecordは、保留中の移行(https:// github。com/rails/rails/blob/4-2-stable/activerecord/lib/active_record/railties/databases.rake#L360)を参照してください。この作業の中で、ドロップもまた起こる。 'test:prepare'が呼び出されていないときは、データベースはドロップも作成もされません。テスト用のデータベースが存在することを確認する必要がありますが、これは質問に付属しています。 – slowjack2k

+0

優秀な説明ありがとうございました:)いくつかの誤報が浮かんでいるようで、私にとっては仕事自体も殴られていないので、私はさらに混乱しました。その説明をソリューションに追加することを検討する価値はあるかもしれません - 私はそれが価値を付加すると思います。 – David

2

理想的には、RSpecはデータベースを再初期化して、環境を確実に予測可能な状態にするためにテストする必要があります。

あなたができることは、データベースを管理していないRailsアプリケーションがrake db:schema:dumpを実行して、RSpecが使用するschema.rbを生成することです。もちろん、database.ymlのテスト設定がisnあなたのライブデータベースを指していません。

これは技術的にはあなたの質問に対する解決策ではありませんが、テストの失敗原因となる根本的な問題を回避するはずです。

関連する問題