2010-04-24 27 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

相关问题