8

私は2つのモデルを持っていUserますBucket. User has_many Bucketsと。Bucket belongs_to_User

factories.rb、私は持っています:

Factory.define :user do |user|
  user.email  "teste@test.com"
  user.password               "foobar"
  user.password_confirmation  "foobar"
end


Factory.sequence :email do |n| 
  "person-#{n}@example.com"
end

Factory.define :bucket do |bucket|
  bucket.email        "user@example.com"
  bucket.confirmation false
  bucket.association :user
end

次のようなlogin_userモジュールがあります。

def login_user
    before(:each) do
      @request.env["devise.mapping"] = Devise.mappings[:user]
      @user = Factory.create(:user)
      #@user.confirm!
      sign_in @user
    end
  end

私はSporkとWatchを使用していますが、私のBuckets_controller_spec.rbものは次のように簡単です:

describe "User authenticated: " do

   login_user  

   @bucket = Factory(:bucket)

   it "should get index" do
     get 'index'
     response.should be_success
   end
...
end

エラーは常に同じです:

Failures:

  1) BucketsController User authenticated: should get index
     Failure/Error: Unable to find matching line from backtrace
     ActiveRecord::RecordInvalid:
       Validation failed: Email has already been taken
     # ./lib/controller_macros.rb:12:in `block in login_user'

そして、それは私が持っているときにのみ起こりFactory(:bucket)ます. を追加しないと、ログインは正常に機能しFactory(:bucket)ます。

いつも同じエラーです。ユーザーに追加しようとし:email => Factory.next(:email)ましたが、成功しませんでした。

編集:

rails c test

ruby-1.9.2-p180 :019 > bucket = Factory(:bucket, :email => "hello@hello.com")
    ActiveRecord::RecordInvalid: Validation failed: Email has already been taken

    ruby-1.9.2-p180 :018 >   Bucket.create(:email => "hello@hello.com")
     => #<Bucket id: 2, email: "hello@hello.com", confirmation: nil, created_at: "2011-04-08 21:59:12", updated_at: "2011-04-08 21:59:12", user_id: nil> 

編集2:

エラーが関連付けにあることがわかりましたが、修正方法がわかりません。

  bucket.association :user
4

3 に答える 3

6

関連付けを使用してファクトリを定義する場合、ファクトリを使用するたびに関連付けるオブジェクトをファクトリに与える必要があります。

これはうまくいくはずです:

describe "User authenticated: " do
  login_user
  @bucket = Factory(:bucket, :user => @user)

  it "should get index" do
    get 'index'
    response.should be_success
  end
end

そうすれば、factorygirl は @user に関連付けられたバケットを作成することを知っています。

于 2011-04-12T03:51:02.683 に答える
5

ユーザーファクトリーでこれを試してください:

Factory.define :user do |f|
  f.sequence(:email) { |n| "test#{n}@example.com" }
  ...
end

それはおそらくあなたの問題だと思います。使用f.email = "anyvalue"すると、毎回その値が使用されます。次のブロックでシーケンスを作成しようとしていたようですが、そのシーケンスが使用されているかどうかはわかりません。

また、クラッシュなどによってテストが中断された場合、ロールバックされる代わりに、偽のテスト データがテスト DB に残ることがあります。

何かが一度機能してから作業を終了した場合、私が最初に試みることは、テストデータベースをリセットすることです。

rake db:test:prepare

それはすべてをきれいにします。

これでうまくいかない場合はお知らせください。

于 2011-04-08T22:04:28.630 に答える
0

誰かがあなたの意見で最近これを取得している場合。Database Cleanerを使用してみてください。

詳細情報: RailsTutorial - 8.4.3 章 - 統合テストでユーザーを追加した後、テスト データベースがクリアされない

于 2012-09-12T00:24:17.830 に答える