2011-12-27 116 views
0

好吧,所以我建立了一个多对多的关联用户,项目和观看这些项目的能力。 (被称为,而不是我曾经想出“Watchings”的最好名字)FactoryGirl有很多通过

#project.rb 
class Project < ActiveRecord::Base 
    has_many :watchings, :foreign_key => "watched_project_id" 
    has_many :watchers, :through => :watchings, :source => :user 
end 

#user.rb 
class User < ActiveRecord::Base 
    has_many :watchings 
    has_many :watched_projects, :through => :watchings 
end 

#watching.rb 
class Watching < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :watched_project, :class_name => 'Project' 
end 

功能上一切工作到目前为止。我可以观看项目并找出项目有多少观众。但我的黄瓜功能不断出错,因为我不知道如何让Factory Girl合作。

Factory.define :user do |user| 
    user.sequence(:email) {|n| "user#{n}@example.com"} 
    user.password "secret" 
    user.password_confirmation {|u| u.password } 
end 

Factory.define :project do |project| 
    project.name "Project" 
    project.description "Hello World" 
end 

Factory.define :watchings do |watching| 
    watching.association(:user) 
    watching.association(:watched_project) 
end 

我的步骤定义:

Given /^a Project exists called "(.+)" with (\d+) watchers$/ do |project, watchers| 
    @project = Factory(:project) 
    watchers.to_i.times do |watcher| 
    watcher = Factory(:user) 
    watching = Factory(:watching) 
    watching.user = watcher 
    watching.watched_project = @project 
    end 
end 

当步长定义运行时,它恐慌了,并说

undefined method `watching_user_id=' for #<Watching:0x007ff7800c7978> (NoMethodError) 

我已经尝试了一些不同的东西,但我可以”弄清楚如何使它实际上成为测试的关联。

+0

我得到的错误信息实际上来自于我没有意识到的自动生成的工厂。 – DVG 2012-01-07 09:26:17

回答

2

您使用混乱的命名方法。此外,这里也就是工厂女孩的例子,应该工作在:

FactoryGirl.define do 

    factory :project do 
    name "Project" 
    description "Hello World" 
    end 

    factory :user do 
    sequence(:email) { |n| "user#{n}@example.com" } 
    sequence(:password) { |n| "password#{n}" } 
    end 

    factory :watching do 
    user 
    project 
    end   
end 
+0

是的,我真的不为“Watchings”这个名字感到自豪,但我想不出一个不那么丑陋的名字。我会给这个镜头 – DVG 2012-01-07 09:27:29

3

请注意,您使用的是旧FactoryGirl语法工厂的定义。

尝试以下操作:

Factory.define :watchings do |watching| 
    watching.association(:user) 
    watching.association(:watched_project), :factory => :project 
end 

这应该告诉收看工厂watched_project实际上是project类型。

随着新的语法完整工厂定义是这样的:

FactoryGirl.define do 
    factory :user do 
    sequence(:email) {|n| "user#{n}@example.com"} 
    password "secret" 
    password_confirmation {|u| u.password } 
    end 

    factory :project do 
    name "Project" 
    description "Hello World" 
    end 

    factory :watchings do 
    user 
    association :watched_project, :factory => :project 
    end 
end 

它看起来干净多了。