我有一个对象,该对象从rest API获取信息。假设我从API调用帖子,并且可以指定要提取的字段。只是外观的一个示例:
Post.find!(id: 1, fields: [:id, :title, :description])
这会进行API调用,并且会向我返回包含这些指定字段的Post对象。
为了进行测试,我将这个API调用与Factory Bot结合在一起,并直接返回Post对象以及它可以查询的所有可能字段。
这种方法不是最好的方法,因为测试总是返回所有字段,而代码本身可能只是我需要几个字段,而不是全部
所以我正在尝试实现类似(在FactoryBot中)的功能:
build(:post, fields: [:id,:title])
并设置具有ID和标题的Post对象。
如果我这样做build(:post, fields: [:title, :created_at])
,则只设置标题和created_at的Post对象。等等...
做了一些研究并尝试了一些想法,但都没有成功地建立流程。
关于如何实现此行为的任何想法吗?
编辑特性似乎是一个不错的选择,但是我必须和API调用一样一致,并指定这些特性fields
。所以特质对我不起作用...
假设这是您的Post工厂:
FactoryBot.define do
factory :post do
sequence(:title) { |n| "Post no. #{n}" }
description 'Post description'
created_at { DateTime.now }
end
end
调用时build(:post)
,将创建一个带有标题,created_at和描述集的对象。
但是,如果您要从工厂中删除这些字段(或将它们移到特征下):
FactoryBot.define do
factory :post do
trait :all_fields do
sequence(:title) { |n| "Post no. #{n}" }
description 'Post description'
created_at { DateTime.now }
end
end
end
然后:
build(:post, title: 'Post title', description: 'Post description')
将创建一个post对象,其中仅设置标题和描述(created_at将为nil)build(:post, :all_fields)
将创建一个post对象,所有字段都将设置。编辑
我想我现在对问题更了解了。假设这是您的工厂:
FactoryBot.define do
factory :post do
sequence(:title) { |n| "Post no. #{n}" }
created_at { DateTime.now }
description 'Post description'
end
end
更改为:
FactoryBot.define do
factory :post do
transient do
fields []
end
sequence(:title) { |n| "Post no. #{n}" }
created_at { DateTime.now }
description 'Post description'
after :build do |post, evaluator|
unless evaluator.fields.empty? do
(post.attributes.keys - evaluator.fields).each do |attribute_to_remove|
post.send("#{attribute_to_remove}=", nil)
end
end
end
end
end
然后,您可以这样称呼它:
build(:post)
创建所有字段的帖子build(:post, fields: ['description', 'title'])
创建一个帖子,其中除description和title外的所有内容均为nil
。这个解决方案应该可以按预期工作,但是它可能会减慢您的测试速度(我认为它看起来不太好:))
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句