2010-04-24 44 views
1

我寫了我的基本模型,並定義了它們的關聯以及遷移來創建關聯的表。我如何測試我的桌子設計是否正確地實現了我的關聯?

編輯 - 增加我特別想測試的重點。

我希望能夠測試:

  • 的關聯被配置爲目的
  • 表結構支持協會的正確

我已經爲我的所有車型編寫FG工廠,以期望擁有一套完整的測試數據但我無法掌握如何編寫一個spec來測試belongs_to和has_many關聯。

例如,給定has_many用戶的組織我希望能夠測試我的示例組織對我的示例用戶的引用。

Organization_Factory.rb:

Factory.define :boardofrec, :class => 'Organization' do |o| 
    o.name 'Board of Recreation' 
    o.address '115 Main Street' 
    o.city 'Smallville' 
    o.state 'New Jersey' 
    o.zip '01929' 
end 

Factory.define :boardofrec_with_users, :parent => :boardofrec do |o| 
    o.after_create do |org| 
    org.users = [Factory.create(:johnny, :organization => org)] 
    end 
end 

User_Factory.rb:

Factory.define :johnny, :class => 'User' do |u| 
    u.name 'Johnny B. Badd' 
    u.email '[email protected]' 
    u.password 'password' 
    u.org_admin true 
    u.site_admin false 
    u.association :organization, :factory => :boardofrec 
end 

Organization_spec.rb:

... 
    it "should have the user Johnny B. Badd" do 
    boardofrec_with_users = Factory.create(:boardofrec_with_users) 
    boardofrec_with_users.users.should include(Factory.create(:johnny)) 
    end 
... 

此示例失敗,因爲Organization.users列表和比較用戶:johnny是同一工廠的單獨實例。

我意識到這並沒有遵循這些插件(FG,rspec)背後的BDD想法,但看到這是我的第一個rails應用程序,我不自然地前進而不知道我已經配置我的關聯和表格結構正確。

回答

2

您的用戶已經出廠憑藉工廠女孩association方法創建一個組織:

it "should associate a user with an organization" do 
    user = Factory.create(:johnny) 
    user.organization.name.should == 'Board of Recreation' 

    organization = user.organization 
    organization.users.count.should == 1 
end 

看看「日誌/ test.log中」運行你的天賦後 - 你應該看到一個INSERT組織和用戶。

如果你想沒有工廠女孩聯想到測試,做一個工廠剛剛創建的用戶,並在規範的關聯:

it "should associate a user with an organization" do 
    user = Factory.create(:johnny_no_org) 
    org = Factory.create(:boardofrec) 
    org.users.should be_empty 
    org.users << user 
    org.users.should include(user) 
end 

當然,這一切都在做的是測試的ActiveRecord是否做好自己的工作。由於ActiveRecord已經過全面測試,所以一旦您確信框架實際上完成了它應該做的事情,您就需要專注於測試應用程序的功能。

+0

我改變了標題,並加強了我正在尋求解決的問題。我意識到沒有必要測試ActiveRecord本身,但我正在測試是否**我已**正確地實現了我的關聯,並使用適當的表格設計正確地支持了它們。 – 2010-04-25 17:47:32

+0

夠公平的。參考我的第二個例子,我認爲足夠的關聯測試應該是'org.users.should include(user)'('has_many'方面)和'user.organization.should == org'('belongs_to'方面 – zetetic 2010-04-25 20:00:31

+0

太好了,謝謝你,試試看。 – 2010-04-25 22:40:20

相關問題