14

ユーザー テストを実行するたびに、RSpec は、テストが完了した後、Fabricated ユーザーをテスト データベースに残します。これにより、他のテストが台無しになります。をrake db:test:prepare実行しますが、テストを再度実行すると、データベースにレコードが再作成されます。なぜこれが起こっているのか分かりません。これは、ユーザー オブジェクトでのみ発生します。

私の spec_helper ファイルには、次のものもあります。

config.use_transactional_fixtures = true

レコードを作成するテストの例を次に示します。

it "creates a password reset token for the user" do
  alice = Fabricate(:user) 
  post :create, email: alice.email
  expect(assigns(alice.password_reset_token)).to_not eq(nil)
end

製作者:

Fabricator(:user) do
  email { Faker::Internet.email }
  password 'password'
  name { Faker::Name.name }
end

これは私のユーザー モデルと関係がありますか?

4

4 に答える 4

23

データベースを切り捨ててすべてを自動的にリセットする database_cleaner という gem を使用する必要があります。そのため、gem ファイルに gem database_cleaner を追加し、その後 spec_helper.rb 内に構成します。

spec_helper.rb

config.use_transactional_fixtures = false

config.before(:suite) do
  DatabaseCleaner.strategy = :truncation
end

config.before(:each) do
  DatabaseCleaner.start
end

config.after(:each) do
  DatabaseCleaner.clean
end

次に、spec/support ディレクトリに新しいファイルを作成します。

仕様/サポート/shared_db_connection.rb

class ActiveRecord::Base
  mattr_accessor :shared_connection
  @@shared_connection = nil

  def self.connection
    @@shared_connection || retrieve_connection
  end
end
ActiveRecord::Base.shared_connection=ActiveRecord::Base.connection

これで、テストを実行するたびに、データベースがリセットされます。これは、Aaron Sumner による書籍「Everyday Rails testing with RSpec」からの引用です。

于 2013-10-06T15:58:30.937 に答える
8

各テストは、データベース トランザクションにラップされます。つまり、テスト中に作成されたものはすべて、テストが終了すると消えてしまうはずです。したがって、データベースにあるものはすべて、テスト自体の外部で作成されたものであると思われます (before(:all)ブロック内など)。

また、これは、テストを実行するたびにデータベースが空になることを保証するものではありません。何らかの方法で誤ってレコードを追加した可能性がありますが、現在はその状態に戻り続けています。

テストのデータベースが常にピカピカであることを確認したい場合は、database_cleaner gem を確認する必要があります。

于 2013-10-06T15:51:49.427 に答える
0

推測するに、この行post :create, email: alice.emailは実際のユーザー作成を行うための有力な候補のように思えます。

偽のテストでその行をスタブし、DB で作成されたユーザーがまだ取得されているかどうかを確認します。

于 2013-10-06T14:48:26.777 に答える