让我们以这些工厂为例来考虑它们之间的差异:
FactoryBot.define do
factory :post do
user
title { 'Post title' }
body { 'Post body' }
end
end
FactoryBot.define do
factory :user do
first_name { 'John' }
last_name { 'Doe' }
end
end
构建
使用构建
方法非常容易。它返回一个未保存的Post
实例。
post = FactoryBot.build(:post)
p post
p post.user
#<Post:0x00007fd10f824168> {
:id => nil,
:user_id => nil,
:title => "Post title",
:body => "Post body",
:created_at => nil,
:updated_at => nil
}
#<User:0x00007f8792ed9290> {
:id => nil,
:first_name => "Post title",
:last_name => "Post body",
:created_at => nil,
:updated_at => nil
}
Post.all
User.all
创建
使用create
方法非常明显,它会保存并返回一个Post
实例。但是,它会调用所有验证和回调函数,并创建与之关联的User
实例。
post = FactoryBot.create(:post)
p post
p post.user
#<Post:0x00007fd10f824168> {
:id => 1,
:user_id => 1,
:title => "Post title",
:body => "Post body",
:created_at => Sat, 18 Jun 2022 05:32:17.122906000 UTC +00:00,
:updated_at => Sat, 18 Jun 2022 05:32:17.122906000 UTC +00:00
}
#<User:0x00007f8792ed9290> {
:id => 1,
:first_name => "John",
:last_name => "Joe",
:created_at => Sat, 18 Jun 2022 05:32:17.122906000 UTC +00:00,
:updated_at => Sat, 18 Jun 2022 05:32:17.122906000 UTC +00:00
}
数据库中创建了帖子记录和相关用户记录:
Post.all
User.all
build_stubbed
build_stubbed
模拟创建。它设置了 id
、created_at
、updated_at
和 user_id
属性的值。此外,它跳过所有验证和回调。
Stub 表示 FactoryBot
仅初始化对象并分配给 id
、created_at
和 updated_at
属性的值,以使其看起来像已经创建了。对于 id
,它将指定整数号码 1001
(1001 只是 FactoryBot 使用的默认编号),对于 created_at
和 updated_at
,它会分配当前日期时间。对于每个使用 build_stubbed
创建的其他记录,它将递增要分配给 id 的编号。首先,FactoryBot
初始化一个 user
记录,并将 id
属性设为 1001
,但不保存到数据库中,然后初始化 post
记录,并将 id
属性设置为 1002
,将 user_id
属性设置为 1001
以进行关联,但也不将记录保存到数据库中。请参见下面的示例。
post = FactoryBot.build_stubbed(:post)
p post
p post.user
#<Post:0x00007fd10f824168> {
:id => 1002,
:user_id => 1001,
:title => "Post title",
:body => "Post body",
:created_at => Sat, 18 Jun 2022 05:32:17.122906000 UTC +00:00,
:updated_at => Sat, 18 Jun 2022 05:32:17.122906000 UTC +00:00
}
#<User:0x00007f8792ed9290> {
:id => 1001,
:first_name => "John",
:last_name => "Joe",
:created_at => Sat, 18 Jun 2022 05:32:17.122906000 UTC +00:00,
:updated_at => Sat, 18 Jun 2022 05:32:17.122906000 UTC +00:00
}
无法在数据库中创建帖子和用户记录!!!
Post.all
User.all
it stubs
id,
created_at,
updated_at"和
user_id的含义。
build_stubbed方法的输出和
create方法的输出有什么区别?我看到
id和
user_id`值不同,但为什么呢?你能详细解释一下吗? - Code-Apprentice