我正在为我的项目开发一个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
需要Protocol
,Rejection
需要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)
看起来Record
和Rejection
工厂都在尝试创建Protocol
来完成这些验证,但在第一个工厂之后,Protocol
中的名称工厂不再是独一无二的,它正在使其他人失败。我该如何防止这些错误?我可以重复使用相同的Protocol
,但我不知道该怎么做。我尝试在before(:create)
和Record
工厂中使用Rejection
块进行此操作,但这似乎是一种脆弱的方法。任何建议将不胜感激。谢谢!
答案 0 :(得分:0)
成功!我使用了FactoryGirl sequence
方法。我之前认为这是一个私有API(错误)阅读文档,但是因为我在ThoughtBot自己的Testing Rails书中找到了解决方案(我在测试版中购买并且已经非常有用),认为它是合法的。
解决方案是在name
类中将email
和Protocol
指定为序列,如下所示:
factory :protocol do
sequence(:name) {|n| "Protocol#{n}"}
sequence(:email) {|e| "proto_#{e}@example.com}"}
end