2013-06-04 24 views
1

我開始與RSpec的,所以我不知道如何進行以下操作:如何用rspec製作多對多模型?

我有UserLabel稱爲Assignment之間的許多一對多表。 例如

  • 「用戶A」 被分配給 「IT」
  • 「用戶B」 被分配給 「研究」

製造者:

Fabricator(:label) do 
    name { sequence(:name) { |i| "Label #{i}" } } 
end 

Fabricator(:user) do 
    email { sequence(:email) { |i| "user#{i}@email.com" } } 
    password 'password' 
end 

型號:

class Label < ActiveRecord::Base 
    has_many :issues 
    has_many :assignments 
    has_many :users, :through => :assignments 

class User < ActiveRecord::Base 
    has_many :assignments 
    has_many :labels, :through => :assignments 

class Assignment < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :label 
end 

class Issue < ActiveRecord::Base 

    belongs_to :user 
    belongs_to :label 

    after_create :print_first_user_label_email 

    def print_first_user_label_email 
    puts self.label.users.first.email 
    end 

end 

問題必須在每次創建問題時打印分配給問題標籤的用戶。但它要求標籤應該已經與用戶(任務)有鏈接。

所以,一個簡單的工房(:發行)將觸發:

let(:issue) { Fabricate(:issue) } 

-- Output --------------------------------------- 

Failure/Error: let(:issue) { Fabricate(:issue) } 
    NoMethodError: 
     undefined method `email' for nil:NilClass 

那麼,我該如何解決。打樁?以某種方式播種桌子?在製造商中定義?

任何幫助將是偉大的!

回答

1

apparence ...它不令人滿意。你如何製作issue.label?

姑且...
[issue_fabricator]

Fabricator(:issue) do 
end 

[規格]

let(:label){ Fabricate(:label) } 
let(:issue){ Fabricate(:issue, :label=>label) } 
#=> undefined method `email' for nil:NilClass 

好。和print_first_user_label_email工作...
自我#=>問題
.label#=>標籤
。用戶#=> [](空)
。首先#=>零
.email#=>未定義方法

試試看:

let(:user) { Fabricate(:user) } 
let(:label){ Fabricate(:label, :users=>[user]) } 
let(:issue){ Fabricate(:issue, :label=>label) } 

或之前{}塊分配關係。