如何使用rspec制作多对多模型?

时间:2013-06-04 03:24:16

标签: ruby-on-rails testing 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

每次创建问题时,问题都必须打印为问题标签分配的用户。但它要求标签应该已经与用户(作业)有链接。

因此,一个简单的Fabricate(:issue)将触发:

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

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

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

那么,我该如何解决呢。打桩?以某种方式播种表?定义在制造商?

任何帮助都会很棒!

1 个答案:

答案 0 :(得分:1)

表面......它不尽如人意。你怎么做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工作是...
自我#=&gt;问题
.label#=&gt;标签
.users#=&gt; [](空)
.first#=&gt;零
.email#=&gt;未定义的方法

试一试:

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

或在{}阻止之前分配关系。