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

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

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

factory :user_1, class: User do
  email             "123@123.com"
  password        "xxx"
  password_confirmation      "xxx"
end

另外还有两个user,假设分别为user2user3

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呢?

共收到 3 条回复

对于你这种 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 我现在有这个问题,请问具体是怎么解决的!

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