如何测试我的表设计是否正确实现了我的关联?

时间:2010-04-24 04:57:19

标签: ruby-on-rails rspec factory-bot

我编写了基本模型并定义了它们的关联以及创建关联表的迁移。

编辑 - 强调我特别想要测试的内容。

我希望能够测试:

  • 关联已按预期配置
  • 表格结构正确支持关联

我为所有模型编写了FG工厂,期望拥有一套完整的测试数据,但我无法掌握如何编写规范以测试belongs_to和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 'jbadd@gmail.com'
  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列表和比较User:johnny是同一Factory的单独实例。

我意识到这并不遵循这些插件(FG,rspec)背后的BDD想法,但看到这是我的第一个rails应用程序我不舒服地向前推进而不知道我已经配置了我的关联和表结构正确。

1 个答案:

答案 0 :(得分:2)

您的用户工厂已根据Factory Girl 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

运行规范后,请查看“log / test.log” - 您应该看到组织和用户都有INSERT。

如果您想在没有Factory Girl协会的情况下进行测试,请创建一个只创建用户并在规范中建立关联的工厂:

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已经过全面测试,一旦你确信自己的框架实际上已经完成了它应该做的事情,你就会专注于测试应用程序的功能。