测试 请教 FactoryGirl 关联对象重复创建的问题

wuwx · October 24, 2015 · Last by xiaoronglv replied at October 25, 2015 · 2014 hits

我们定义了三个模型 User => Post => Comment 我们对 User 模型验证 name 的唯一性,FactoryGirl 的定义如下:

FactoryGirl.define do
  # user
  factory :user do
    name "User"
  end
  # post
  factory :post do
    user
    title "Title"
    content "Content"
  end
  # comment
  factory :comment do
    user
    post
    content "Content"
  end
end

结果当我们使用 @comment = FactoryGirl.create(:comment) 创建一个新的 comment 的时候 就会提示 name 已经被使用过了

应该是因为 user 被创建了两次的缘故,请问大家是如何解决这个问题的呢

factory :user do
  sequence(:name) { |n| "name_#{n}"  }
 end

#1 楼 @hz_qiuyuanxin 这个写法会导致 2 个 user 不是同一个对象……,我希望这 2 个 user 一样……

#2 楼 @wuwx

user = create :user
post = create :post, user: user
comment = create :comment, post: post, user: user

#3 楼 @hz_qiuyuanxin 懂了,非常感谢

#3 楼 @hz_qiuyuanxin 我用这种,但感觉还是不良好,还有更好的吗?

6 Floor has deleted

#5 楼 @flowerwrong 不知道这样对不对,没验证过

factory :user do
  sequence(:name) { |n| n.to_s }
end

factory :post do
  sequence(:title) { |n| "post title #{n}" }
  content "hey, girl"
  association :user
end

factory :comment do
  content "Hu la, hu la"
  association :user

  factory :comment_with_post do
    association :post
  end

  factory :comment_with_post_and_same_user do
    before :create do |comment, evaluator|
        comment.post = create :post, user: comment.user
    end
  end
end

# 使用
#
# 创建包含 post 的 comment
comment = create :comment_with_post
# 创建包含 post,且相同用户
comment = create :comment_with_post_and_same_user

这是我的版本,供参考:

users.rb

FactoryGirl.define do
  # user
  factory :user do
    # 动态 name,可创建多个用户
    name { SecureRand.hex }
  end
end

posts.rb

FactoryGirl.define do
  factory :post do
    user { create :user }
    title "Title"
    content "Content"

    trait :with_comments do 
      ignore do 
        number_of_comments 3 
      end

      after :create do |post, evaluator|
        FactoryGirl.create_list :comment, evaluator.number_of_comments, :post => post
        post.reload
      end
    end
  end
end

各种使用场景

创建 user1: user1 = create :user

创建 user2: user2 = create :user

创建一个 post: post = create :post

创建一个含有 3 个 comments 的 post: post = create :post, :with_comments, :number_of_comments => 3

楼主的场景

def setup
  @post =  create :post, :with_comments, :number_of_comments => 3
  @comment = @post.comments.last
end

参考资料:FactoryGirl Tips and Tricks

You need to Sign in before reply, if you don't have an account, please Sign up first.