首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >factory_bot build_stubbed策略

factory_bot build_stubbed策略
EN

Stack Overflow用户
提问于 2022-06-17 17:19:15
回答 1查看 442关注 0票数 1

用于构建策略的bot文档说:

factory_bot支持几种不同的构建策略:构建、创建、attributes_for和build_stubbed

并继续给出一些用法的例子。然而,它并没有清楚地说明每一个结果是什么。我使用createbuild已经有一段时间了。从描述中看,attributes_for似乎很简单,我看到了它的一些用途。然而,什么是build_stubbed?描述说

返回一个具有所有已定义属性的对象。

“擦出”是什么意思?这与createbuild有何不同?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-18 05:57:27

让我们考虑一下这些工厂的例子的不同之处:

代码语言:javascript
运行
复制
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

构建

使用build方法,一切都很简单。它返回一个未保存的Post实例

代码语言:javascript
运行
复制
# initialization
post = FactoryBot.build(:post)
代码语言:javascript
运行
复制
# call

p post
p post.user
代码语言:javascript
运行
复制
# output
#<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
}
代码语言:javascript
运行
复制
Post.all # => []
User.all # => []

创建

使用create,一切都是显而易见的。它保存并返回一个Post实例。但是它调用所有的验证和回调,并创建User的相关实例。

代码语言:javascript
运行
复制
# initialization
post = FactoryBot.create(:post)
代码语言:javascript
运行
复制
# call

p post
p post.user
代码语言:javascript
运行
复制
# output

#<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记录和相关用户记录:

代码语言:javascript
运行
复制
Post.all # => [<Post:0x00007fd10f824168> {...}]

# User also created in the database
User.all # => [<User:0x00007f91af405b30> {...}]

build_stubbed

build_stubbed模仿创建。它使用idcreated_atupdated_atuser_id属性。此外,它跳过所有验证和回调。

存根意味着FactoryBot只是初始化对象并将值赋值给idcreated_atupdated_at属性,这样看起来就像创建了的。对于id,它分配整数号1001 (1001只是FactoryBot用来分配给id的缺省数字),created_atupdated_at分配当前的日期时间。对于使用build_stubbed创建的其他每条记录,都会增加编号,将其分配给id 1。首先,FactoryBot初始化user记录并将1001赋值给id属性,而不是将其保存到数据库中,而是初始化post记录并将1002保存到id属性,并将1001添加到user_id属性以进行关联,但也不将记录保存到数据库中。见下面的例子。

代码语言:javascript
运行
复制
#initialization
post = FactoryBot.build_stubbed(:post)
代码语言:javascript
运行
复制
# call

p post
p post.user
代码语言:javascript
运行
复制
# output
# It looks like persisted instance
#<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
}

没有在数据库中创建帖子和用户记录!

代码语言:javascript
运行
复制
# it is not persisted in the database
Post.all # => []

# Association was also just stubbed(initialized) and there are no users in the database.
User.all # => []
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72662800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档