1

我从 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

那么,我该如何解决。存根?以某种方式在桌子上播种?在制造商中定义?

任何帮助都会很棒!

4

1 回答 1

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 的工作是......
self #=> issue .label #
=> label
.users #=> [] (empty) .first #
=> nil
.email #=> 未定义的方法

去尝试一下:

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

或在 before{} 块中分配关系。

于 2013-06-04T05:00:03.763 回答