停止FactoryGirl将我的字符串转换为浮点数

时间:2015-06-26 02:08:14

标签: ruby-on-rails ruby factory-bot fabrication-gem

我有这些工厂设置:

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?好吧,虽然price属性在数据库级别是数据类型float,但偶尔我想构建一个包含所有属性作为字符串的Factory。

这样我就可以构建工厂,然后在将它们传递给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

好吧,所以在某个地方,在铁轨或工厂女郎中,to_f正在我心爱的字符串上调用。哪里?我怎么阻止它?

1 个答案:

答案 0 :(得分:1)

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

Fabricate.attributes_for(:string_product)