代码之家  ›  专栏  ›  技术社区  ›  Jeff Swensen

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

  •  1
  • Jeff Swensen  · 技术社区  · 16 年前

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

    我希望能够测试:

    • 关联按预期配置
    • 表结构适当地支持这些关联

    我已经为我所有的模型编写了FG工厂,期望有一套完整的测试数据,但是我不能掌握如何编写一个规范来测试两者所属的和有许多关联的。

    组织机构\工厂.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
    

    用户\u 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
    

    ...
      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
    ...
    

    我意识到这并没有遵循这些插件(FG,rspec)背后的BDD思想,但鉴于这是我的第一个rails应用程序,我不太愿意在不知道我已经正确配置了关联和表结构的情况下继续前进。

    1 回复  |  直到 16 年前
        1
  •  2
  •   zetetic    16 年前

    您的用户工厂已经凭借工厂女孩创建了一个组织 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
    

    如果要在没有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已经过了全面的测试,那么一旦您确信框架确实完成了它应该做的事情,您就应该集中精力测试应用程序的功能。