测试 关于 factory_girl 的重复创建关联对象问题

newlife_in_s1 · 2014年10月23日 · 最后由 davidleeqk 回复于 2016年07月31日 · 2203 次阅读

在 factory_girl 里我定义了下面的一些数据

factory :user_1, class: User do
  email             "[email protected]"
  password        "xxx"
  password_confirmation      "xxx"
end

另外还有两个user假设分别为user2和user3

factory :question_1, class: Question do
  title       "题目"
  content     "内容"
  association :user, factory: :user_1
end

factory :answer_1, class: Answer do
  content             "答案1"
  association :user, factory: :user_2
  association :question, factory: :question_1
end

factory :answer_2, class: Answer do
  content             "答案2"
  association :user, factory: :user_3
  association :question, factory: :question_1
end

因为要测试答案之间的排序是否正确,所以在测试代码中有如下代码

answer_1 = FactoryGirl.create(:answer_1)
answer_2 = FactoryGirl.create(:answer_2)

然后就报错

ActiveRecord::RecordInvalid: Validation failed: Email has already been taken

因为错误提示是在 answer_2 创建的那行,我认为应该是因为我的两个答案都关联了 question_1,那么在创建 answer_1 的时候关联创建了 question_1 及 user_1,创建 answer_2 的时候又再重复创建 question_1 及 user_1,所以 user_1 被创建了 2 次,key 重复了。

请问在应该如何解决这问题?是否不应该所有 fk 处都用 association 呢?

对于你这种 user_1, user_2, user_3,我建议楼主还是好好看看文档吧!磨刀不误砍柴工

而关于这个 ActiveRecord::RecordInvalid: Validation failed: Email has already been taken 错误,我猜是你的 user_2 和 user_3 的 email 值有问题,这个要看看你在模型里面的 validation 是怎么写的。

还有,创建记录的时候,是可以指定某个 attribute 的值的,这个文档里面也有说:

已经解决了,在 create 的时候直接赋值 user,可以跳过 user1 的因为被双重依赖重复创建的问题。 另,用 user1, 2, 3 是为了举例方便,是否用 sequence 不是本问题重点。

#2 楼 @newlife_in_s1 我现在有这个问题,请问具体是怎么解决的!

需要 登录 后方可回复, 如果你还没有账号请 注册新账号