我有这些工厂设置:
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
正在我心爱的字符串上调用。哪里?我怎么阻止它?
答案 0 :(得分:1)
使用fabrication
,您需要使用attributes_for
生成对象的哈希表示。它将完全绕过ActiveRecord
模型,因此不应强制执行任何操作。
Fabricate.attributes_for(:string_product)