26

FactoryGirl/を使用してセッションをシミュレートしようとしていますshoulda(フィクスチャでは機能しましたが、ファクトリの使用に問題があります)。私は次の工場を持っています(ユーザーログインと電子メールの両方にunique検証があります):

Factory.define :user do |u| 
 u.login 'quentin'
 u.email 'quentin@example.com'
end

Factory.define :session_user, :class => Session do |ses| 
 ses.association :user, :factory => :user
 ses.session_id 'session_user'
end

そしてここにテストがあります

class MessagesControllerTest < ActionController::TestCase

 context "normal user" do
  setup do 
   @request.session[:user_id]=Factory(:user).id
   @request.session[:session_id]=Factory(:session_user).session_id
  end

  should "be able to access new message creation" do
   get :new
   assert_response :success
  end
 end
end

しかし、実行するrake test:functionalsと、このテスト結果が得られます

 1) Error: 
  test: normal user should be able to access new message creation. (MessagesControllerTest):
  ActiveRecord::RecordInvalid: Validation failed: Account name already exists!, Email already exists!

これは、テスト セットアップでレコードを参照しているときに、レコードが既に db に存在することを意味します。ここでわからないことがありますか?起動FactoryGirl時にdbにすべての工場を作成しますか?

レール 2.3.5/shoulda/FactoryGirl

4

1 に答える 1

38

Factory(:user)Factory.create(:user)セットアップ内で 2 つのオブジェクトを作成し、それらをデータベースに保存するためのショートカットです。

Factory.build(:user)userDBに保存せずにレコードを作成します。

編集

ファクトリ内でsession_userユーザーを作成し、テスト セットアップ内で別のユーザーを作成します。工場に関連付けがあるためFactoryGirl、新しいuserレコードが作成されます。session_user

user次のように、オブジェクトからインスタンスを取得できますsession_user:-

 context "normal user" do
  setup do
   session = Factory(:session_user)  
   @request.session[:session_id] = session.session_id
   @request.session[:user_id] = session.user_id
  end

userまたは、工場に詳細を追加して、次のように一意の名前と電子メール アドレスを確保することもできます。

Factory.define :user do |u| 
 u.sequence(:login) {|n| "quentin#{n}" }
 u.sequence(:email) {|n| "quentin#{n}@example.com"}
end
于 2010-04-23T09:17:30.520 に答える