1

我有这些工厂设置:

FactoryGirl.define do
        factory :product do
                name { Faker::Commerce.product_name }
                price { Faker::Commerce.price }
                image { Faker::Internet.url }
        end

        factory :new_product, parent: :product do
                name nil
                price nil
                image nil
        end

        factory :string_product, parent: :product do
                price { Faker::Commerce.price.to_s }
        end
end

为什么我要使用 :string_product?好吧,虽然价格属性在数据库级别是浮点数据类型,但有时我想构建一个工厂,将所有属性都作为字符串。

这样我就可以构建工厂,然后在将它们传递到 params 散列时对其属性运行期望。(URL 中的所有参数都是字符串)

但是,在 rails 控制台中:

> FactoryGirl.build :string_product
=> #<Product:0x00000007279780 id: nil, name: "Sleek Plastic Hat", price: 43.54, image: "http://blick.name/moie", created_at: nil, updated_at: nil>

如您所见,price仍然被保存为字符串。

一个试图看看发生了什么的实验:

        ...
        factory :string_product, parent: :product do
                price { "WHY ARE YOU NOT A STRING?" }
        end
        ...

结果是:

=> #<Product:0x000000077ddfa0 id: nil, name: "Awesome Steel Pants", price: 0.0, image: "http://rogahn.com/kavon", created_at: nil, updated_at: nil>

我的字符串现在转换为浮点数0.0

如何防止这种行为?如果我想将我的属性之一作为字符串,尤其是当我只使用它时build,我应该被允许这样做。是否有可以阻止这种情况发生的 FactoryGirl 配置?宝石也发生了完全相同的事情Fabrication,所以我猜这与模型有关?我的Product模型现在实际上是空的……没有验证或任何东西,那怎么可能呢?FactoryGirl 知道价格是浮点数的唯一方法是因为它在数据库级别具有该数据类型。

无论如何,这真的很烦人,如果有人可以告诉我如何让我将字符串写入我的工厂属性,我将非常感激。我可以.to_s在规范本身中使用,但我想尽可能保持规范干净,并认为工厂将是保持这种配置的好地方......

有没有可以让我这样做的制造库?

只是更多的实验:

> "WHY ARE YOU NOT A STRING".to_f
=> 0.0

好的,所以在某个地方,在 rails 或 factorygirl 中,to_f正在我心爱的字符串上被调用。在哪里?我该如何阻止它?

4

1 回答 1

1

fabrication您需要使用来attributes_for生成对象的哈希表示。它将ActiveRecord完全绕过模型,因此不应强制任何内容。

Fabricate.attributes_for(:string_product)

于 2015-06-26T12:49:36.843 回答