2012-09-11 52 views
2

我對RSpec和FactoryGirl來說很新,並且試圖讓我的測試在使用RSpec的工廠時通過。當使用FactoryGirl的序列時驗證失敗

我有一個規範/控制器/ shares_controller_spec.rb規格如下所示:


require 'spec_helper' 

describe SharesController do 
    let(:user) do 
    user = FactoryGirl.create(:user) 
    user 
    end 

    let(:share) do 
    share = FactoryGirl.create(:share) 
    share 
    end 

    context "standard users" do 
    it "cannot remove other person's shares" do 
     sign_in(:user, user) 
     send('delete', 'destroy', :id => share.id) 
     response.should redirect_to shares_path 
     flash[:alert].should eql('You must be the author to delete this share.') 
    end 
    end 
end 

和投機/ factories.rb:


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

    factory :share do 
    title "Test" 
    content "Test" 
    user FactoryGirl.create(:user) 
    end 
end 

當我運行

rspec spec/controllers/shares_controller_spec.rb
我的測試但它不知何故打破了黃瓜:

$ rake cucumber:ok 
rake aborted! 
Validation failed: Email has already been taken 

Tasks: TOP => cucumber:ok => db:test:prepare => db:abort_if_pending_migrations => environment 
(See full trace by running task with --trace)

我在做什麼錯? 在此先感謝。

回答

2

是讓我最奇怪的代碼中的幾件事情:

let(:user) do 
    user = FactoryGirl.create(:user) 
    user 
end 

let(:share) do 
    share = FactoryGirl.create(:share) 
    share 
end 

你爲什麼分配usershare這裏,然後退呢?所有你需要的是:

let(:user) { FactoryGirl.create(:user) } 
let(:share) { FactoryGirl.create(:share) } 

而且在你的工廠,你不需要告訴FactoryGirl創建user協會,它會自動做到這一點(見documentation)。因此,這將做到:

factory :share do 
    title "Test" 
    content "Test" 
    user 
end 

既然你已經沒有實際存入您的黃瓜碼這是相當困難的猜測究竟發生了什麼,但我會建議先改變這些東西,看看有沒有什麼幫助。如果沒有,請提供一些關於黃瓜測試的更多信息,我會盡量提供更多建議。

+0

它的工作,非常感謝你!用戶關聯自動生成並不明顯 - 看起來像我錯過了文檔中的這一部分。再次感謝! –

+0

不客氣。新的FactoryGirl語法起初有點不直觀,但對於大多數基本用例而言,它大大簡化了工廠代碼。 –

相關問題