如何在Factory Girl中分配一个哈希?

10

我有一个模型,其中有一个名为category_paths的字段。在 postgres 中它是JSONB类型。

当我使用 factory_girl 设置category_paths时,factory_girl 会将值类型更改为 String。即使我分配了一个Hash,也会被更改为String,请考虑以下代码:

FactoryGirl.define do
  factory :product do
    title "MyString"
    after(:build) do |p|
        p.category_paths = Hash.new
        puts p.category_paths.class # This prints as String
    end
  end
end

这很奇怪,我无法弄清楚发生了什么。在Rails控制台中尝试时可以正常工作。问题仅在factory中使用时出现。这是factory_girl的工作方式吗?还是有一种方法来控制这种行为?

这是产品模型:

class Product < ActiveRecord::Base
    acts_as_copy_target
    searchkick autocomplete: ['brand'], callbacks: :async
    scope :search_import, -> { includes(:product_offers) }
    has_many :product_offers, autosave: true
    validates :title, presence: true
    validate :validate_category_paths
end

任何帮助都将不胜感激


展示您的产品模型。 - Sergio Tulentsev
@SergioTulentsev 包括产品型号。 - Navaneeth K N
关于 schema.rb 的相关部分,它显示了表结构怎么样? - Daiku
3个回答

12

我在本地尝试过,并且似乎可以与jsonb字段一起使用:

FactoryGirl.define do
  factory :product do
    title "MyString"
    category_paths { { some_key: some_value } }
  end
end

希望能有所帮助!


1

这对我起作用了

FactoryGirl.define do
  factory(:agent) do
    mls_data({
      :summary => {
        :first => 'Jane',
        :last => 'Doe',
      }
    })
  end
end

1
如果您想在没有块的情况下执行哈希,只需使用括号即可。
因此,它应该像这样:

(代码示例)

FactoryGirl.define do
  factory :product do
    title "MyString"
    category_paths({ some_key: some_value })
  end
end

但是你也可以像这样省略哈希参数中的 {}

FactoryGirl.define do
  factory :product do
    title "MyString"
    category_paths(some_key: some_value)
  end
end

作为一条注释,在未来的版本中,字面量将不再被支持,所以您将需要使用:
FactoryBot.define do
  factory :product do
    title { "MyString" }
    category_paths { { some_key: some_value } }
  end
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接