FactoryGirl linting错误,关联,validates_uniqueness_of

时间:2015-11-16 18:05:17

标签: ruby-on-rails factory-bot

我正在为我的项目开发一个RSpec测试套件,而我正在使用FactoryGirl而不是fixtures。在我运行之前,我正在遵循ThoughtBot关于linting我的套件的建议,但是当我将它们拖拽时我得到FactoryGirl::InvalidFactoryError,并且我知道它与我的关联有问题,但我不知道如何解决它。

问题归结为三种模式:

协定

class Protocol < ActiveRecord::Base
  validates :name, presence: true, uniqueness: true
  validates :email, uniqueness: true
end

记录

class Record < ActiveRecord::Base
  belongs_to :protocol
  validates_presence_of :protocol
  # belongs_to and validates_presence_of other things that appear to be working
end

抑制

class Rejection < ActiveRecord::Base
  belongs_to :record
  validates_presence_of :record
end

因此,Record需要ProtocolRejection需要Record。这是我的工厂:

factory :protocol do
  name "Protocol name"
  email "proto123@domain.com"
end

factory :record do |r|
  status "REVIEW"

  association :protocol
  # other associations that are not causing issues
end

factory :rejection do
  message "Message text here"
  association :record
end

当我舔我的套房时,我收到以下错误:

* record - Validation failed: Name has already been taken, Email has already been taken (ActiveRecord::RecordInvalid)
* rejection - Validation failed: Name has already been taken, Email has already been taken (ActiveRecord::RecordInvalid)

看起来RecordRejection工厂都在尝试创建Protocol来完成这些验证,但在第一个工厂之后,Protocol中的名称工厂不再是独一无二的,它正在使其他人失败。我该如何防止这些错误?我可以重复使用相同的Protocol,但我不知道该怎么做。我尝试在before(:create)Record工厂中使用Rejection块进行此操作,但这似乎是一种脆弱的方法。任何建议将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:0)

成功!我使用了FactoryGirl sequence方法。我之前认为这是一个私有API(错误)阅读文档,但是因为我在ThoughtBot自己的Testing Rails书中找到了解决方案(我在测试版中购买并且已经非常有用),认为它是合法的。

解决方案是在name类中将emailProtocol指定为序列,如下所示:

factory :protocol do
  sequence(:name) {|n| "Protocol#{n}"}
  sequence(:email) {|e| "proto_#{e}@example.com}"}
end