2012-06-26 46 views
3

我想問題是我不知道如何正確使用工廠女孩與Rspec。或者正確測試軌道。還是覺得雖然有點怪異..工廠女孩不啓動對象

我有一個類,用戶,用下面的工廠:

FactoryGirl.define do 
    factory :user do 
    name  "admin" 
    email "[email protected]" 
    adminstatus "1" 
    password "foobar" 
    password_confirmation "foobar" 
    end 

    factory :user_no_admin, class: User do 
    name  "user" 
    email "[email protected]" 
    adminstatus "2" 
    password "foobar" 
    password_confirmation "foobar" 
    end 
... 

我的測試是這樣的:

... 
describe "signin as admin user" do 
    before { visit login_path } 
    describe "with valid information" do 
    let(:user_no_admin) { FactoryGirl.create(:user_no_admin) } 
    let(:user) { FactoryGirl.create(:user) } 
    before do 
     fill_in "User", with: user.name 
     fill_in "Password", with: user.password 
     click_button "Login" 
    end 

    it "should list users if user is admin" do 
     response.should have_selector('th', content: 'Name') 
     response.should have_selector('td', content: user_no_admin.name) 
     response.should have_selector('td', content: user.name) 
    end 
    end  
end#signin as admin user 
... 

基本上我想要測試如果您以管理員身份登錄,您應該會看到所有用戶的列表。我有一個測試,以稍後在文件中以非管理員身份登錄。我已經有幾個db用戶了。

在已登錄的用戶'管理員'列表中顯示以及已經在數據庫中的用戶。然而,'用戶'是不會顯示的,除非我之前做這樣的事情:

fill_in "User", with: user_no_admin.name 
fill_in "Password", with: user_no_admin.password 

這就好像它不會存在,除非我使用它。但是,如果我使用提示,它會打印我所提供的信息,即使我不執行上面的'fill_in'。

我有一個類似的例子,在這個例子中,put可以幫助我。

describe "should have company name" do 
    let(:company) { FactoryGirl.create(:company) } 
    let(:category) { FactoryGirl.create(:category) } 
    let(:company_category) { FactoryGirl.create(:company_category, company_id: company.id, category_id: category.id) } 
    it "should contain companies name" do 
    puts company_category.category_id 
    get 'categories/' + company.categories[0].id.to_s 
    response.should have_selector('h4', :content => company.name) 
    end 
end 

上面沒有我的看跌期權獲得

Called id for nil 

我必須啓動(?)由工廠女孩創建之前,我可以以某種方式使用它的對象?

需要其他代碼嗎?

回答

6
let(:whatever) 

直到您第一次調用它們時才創建對象。如果您希望在第一次使用前使用它,請使用

​​

改爲。

或者使用前塊:

before(:each) do 
    @company = FactoryGirl.create(:company) 
    .... 
end 

您需要使用它們之前,這將創建對象。

+0

有一天我會擅長測試,然後我的生活會很棒。謝謝阿德里安! – abegbg

1

相反的:

factory :user do 
    name  "admin" 
    email "[email protected]" 
    ... 

我會做:

factory :user do |f| 
    f.name "admin" 
    f.email "[email protected]" 
    ... 

相反的:

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

我會做:

@user_no_admin = Factory(:user_no_admin) 
@user = Factory(:user) 
+0

提到在做@user_no_admin一個例子=工廠(:user_no_admin)它在db中創建它們,下一次嘗試創建它時我會得到一個record_invalid。也許之前的塊會解決這個問題。 – abegbg

+0

你可以在創建之前創建一個(:each)塊,並且在每個之後(:each) @ user.destroy – user1170055

+0

爲了避免每次都「在每個破壞之後」執行,可以將其添加到spec_helper中: config .before(:each)做 Sham.reset(:before_each) end – user1170055

0

我有一個類似的問題,與我打破的現有測試,有一個有趣的略有不同的原因。

在這種情況下,被測試的控制器最初調用的是save,但我將其更改爲調用save!,並相應地更新了測試。

修訂後的試驗:

  • 聲明的實例let聲明
  • 設置上保存的期待!方法(例如expect_any_instance_of(MyObject).to receive(:save!)
  • 在預期之後第一次使用該實例。

在內部,它會出現在FactoryGirl調用save!方法,並改變從保存,保存後的期望!沒有工作實際進行(與被測代碼無法從DB找到實例) ,我需要更新,有一個很難得到真正通過沒有破解版)

-1

嘗試在工廠女孩使用特點,有作爲this link

+0

請不要鏈接到其他網站,除非您使用它們來備份此處編寫的代碼和信息。你需要擴大你的答案以便更適合 – Draken