2

次の工場からユーザー、クライアント、請求書を生成します

FactoryGirl.define do
  factory :user do
    sequence(:email) { |n| "person_#{n}@example.com" }
    password "foobar"
    password_confirmation "foobar"
  end

  factory :client do
    sequence(:name) { |n| "Client Name #{n}" }
    sequence(:address1) { |n| "#{n} Street name" }
    sequence(:address2) { |n| "#{n} Area name" }
    city "Chennai"
    state "Tamil Nadu"
    country "India"
    zipcode "600001"
    contactname "Sathish Manohar"
    sequence(:email) { |n| "person_#{n}@example.com"}
    user
  end

  factory :invoice do
    client
  end
end

私はいくつかのリクエストとモデルの仕様を持っています、以下は私が持っている主なリクエストの仕様です:

https://gist.github.com/4418869 --clients_pages_spec.rb
https://gist.github.com/4418876 --invoices_pages_spec.rb

呼び出しですべてusersが削除されたafter(:all) { User.delete_all }場合、を使用して順番に実行すると、すべてのテストに合格します。bundle exec rspec spec --order default

ですべてusersが削除されていない場合after(:all) { User.delete_all }、テストの実行中に電子メールの一意性エラーが表示されます。factory_girl各ユーザーのメールの一意性を検証するのはdeviseのエラーなので、2回目のテストを実行するときは、同じユーザーを作成しようとする と思います。

これはエラーメッセージです:
/home/sathish/.rvm/gems/ruby-1.9.3-p194@invoice_jet/gems/activerecord-3.2.8/lib/active_record/validations.rb:56:in `save!': Validation failed: Email has already been taken (ActiveRecord::RecordInvalid)

このエラーメッセージを取り除き、正しい方法でテストするためのデバイスユーザーを作成するにはどうすればよいですか?

背景情報:
spec_helper.rbデータベースとしてmysqlをconfig.use_transactional_fixtures = true
使用しており、すべてのテーブルがInnoDBエンジン を使用しています

4

1 に答える 1

3

各仕様の後でデータベースを完全にクリーンアップするためのデフォルトの戦略を定義し、それによって、各テストでの分離を保証する必要があると思います。

https://github.com/bmabey/database_cleanerでDatabaseCleanergemを見てください。

あなたがしなければならないのは、gemをGemfileに入れ、実行しbundle(bundlerを使用していると仮定して)、次のように戦略を定義することです。

RSpec.configure do |config|

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

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

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

end

それが役に立てば幸い!

于 2013-01-02T19:50:21.750 に答える