指定要在FactoryBot上使用的字段

鲁彭

我有一个对象,该对象从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

然后:

  1. 调用build(:post, title: 'Post title', description: 'Post description')将创建一个post对象,其中仅设置标题和描述(created_at将为nil)
  2. 调用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

然后,您可以这样称呼它:

  1. build(:post) 创建所有字段的帖子
  2. build(:post, fields: ['description', 'title'])创建一个帖子,其中除description和title外的所有内容均为nil

这个解决方案应该可以按预期工作,但是它可能会减慢您的测试速度(我认为它看起来不太好:))

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何指定要在Jenkins版本中运行的TestNG测试?

如何指定要在具有多重继承的对象中使用的变量?

使用goconvey明确指定要在golang中运行测试的主程序包

如何使用Quarkus指定要在application.properties中使用的基本docker映像

指定要在剧本中使用的特定回调

Rails,如何指定要在控制器的JSON响应中输出的字段?

如何使用Sequelize指定要排序/限制的字段?

指定要在ipyparallel群集中启动的多个ipengine实例

使用值列表指定要在其中插入新行的索引位置

指定要在页面上擦除的表

指定要在Angular中使用的NPM模块平台

如何指定要在docker-compose版本3中使用的容器运行时?

指定要在HAVING子查询中进行比较的列

如何指定要在Typescript数组中删除的项目?

如何指定要在watch grunt config上运行的子作业

指定要在dv.Table.Rows(x)(VALUE).ToString()中使用的行

动态指定要在Angular指令中使用的控制器

在使用/父项目中指定要在类库中使用的log4net配置

如何指定要在SQLite输出中使用的记录定界符?

如何指定要在UITableView中显示的单元格?

指定要在django管理员中呈现的字段

使用配置文件指定要在Python中执行的操作

指定要在每条记录行中打印的参数范围

如何指定要在 Xamarain 列表视图中显示的 json 字段?

指定要在 elasticsearch 中搜索的字段

如何使用环境变量指定要在 .travis.yml 中构建的分支?

Python 请求 - 指定要在 xml 响应中获取的内容

如何指定要在此 for 循环 (R) 中执行的范围?

指定要使用的 SSH