2010-09-24 78 views
2

我正在为一个Ruby on Rails应用程序编写一些RSpec测试,并且遇到了我似乎无法解决的问题。我有一堆与其他人关联的对象,我使用Factory Girl来创建它们。下面是我遇到问题的示例:工厂女孩用Ruby on Rails进行测试,依赖关系

user = Factory.create(:user) 
    package = Factory.build(:package, :user => user) 
    item = Factory.create(:item, :package => package) 

所有软件包属于用户,因此第一个依赖关系相当平凡。创建一个用户然后将它与一个包关联起来,没问题。现在是问题所在。我的包模型有一个验证,说它不能在包中至少包含一个项目的情况下创建。这意味着我不能使用Factory.create。这与在我的packages_controller.rb中执行@ Package.new几乎是一样的,这很好。后来,我继续创建一个项目,问题是,我无法将该项目与包裹关联,因为该包裹尚无ID。

是否有无论如何我可以创建我的包,创建一个项目并保存它,然后将这两个关联在一起,一旦包有一个ID?

回答

2

退房协会:

http://github.com/thoughtbot/factory_girl

相关实例可以使用时 定义lazy属性的关联方法产生 :

Factory.define :post do |p| 
    # ... 
    p.author {|author| author.association(:user, :last_name 
    'Writely') } end 

这样你可以自动创建所需的相关项目。

你会想是这样的:

Factory.define :package do |fac| 
    fac.association :item 
end 

这会寻找一个名为工厂项目,并尝试将其分配给项目=关系。

0

你的验证是相互排斥的:

我的包模式有一个验证的是 说,它不能在没有在 至少一个项目在包中创建

和:

(1)创建我的包,(2)创建一个项目,然后 保存,然后(3)将两个 关联在一起,一旦包有id?

您需要允许创建一个包才能获得一个id。什么是空的包裹无效?也许需要一些其他逻辑来防止它被进一步使用,但是在填充它之前应该可以创建一个包。

0

如果我说得对,你的逻辑看起来有点偏离。要有包装,必须有项目;有ITEM,必须有包装。至少其中的一个必须被允许创建而不需要另一个。

如果这有帮助,这里是您如何自动创建对工厂本身的依赖。在这个例子中,包取决于用户和物品取决于包。这里的魔法是方法协会

当然,您必须正确完成模型关联。

(首先,用户厂)

FactoryGirl.define do 
    factory :user do 
    name { "Some_Name" } 
    end 
end 

(然后,包装厂,其取决于用户)

FactoryGirl.define do 
    factory :package do 
    description { "Some_Description" } 
    user { association(:user) } 
    end 
end 

(然后,项目,这取决于封装)

FactoryGirl.define do 
    factory :item do 
    description { "Some_Description" } 
    package { association(:package) } 
    end 
end 

希望它有帮助!