2

我正在使用 RSpec 为 Ruby on Rails 应用程序编写一些测试,并且遇到了一个我似乎无法弄清楚的问题。我有一堆与其他对象相关联的对象,我正在使用 Factory Girl 来创建它们。这是我遇到问题的示例:

    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 就将两者关联在一起?

4

3 回答 3

2

查看关联:

http://github.com/thoughtbot/factory_girl

定义惰性属性时,可以使用关联方法生成关联实例:

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

这样您就可以自动创建所需的关联项目。

你会想要这样的东西:

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

这将寻找一个工厂命名的项目并尝试将其分配给 item= 关系。

于 2010-09-24T04:11:46.910 回答
0

Your validations are mutually exclusive:

My Package model has a validation that says it cannot be created without at least one item in the package

and:

(1) create my package, (2) create an item and save it, then (3) associate the two together once the package has an id?

You need to allow a package to be created in order for it to get an id. What's invalid about an empty package? Maybe there needs to be some other logic that prevents it from being used further, but it should be possible to create a package before you fill it.

于 2010-09-24T04:26:59.637 回答
0

如果我说得对,你的逻辑似乎有点不对劲。要拥有 PACKAGE,必须拥有 ITEM;要拥有 ITEM,必须拥有 PACKAGE。必须允许在不需要另一个的情况下创建其中至少一个。

如果这有帮助,这里是你如何自动创建对工厂本身的依赖。在这个例子中,Packages 依赖于 User,Item 依赖于 Package。这里的神奇之处在于方法关联

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

(一、用户工厂)

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

(然后是依赖于 User 的包 Factory)

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

(然后,Item,这取决于 Package)

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

希望能帮助到你!

于 2015-11-26T16:18:06.807 回答