2011-05-13 80 views
19

你好,我需要建立工厂为我的模型,例如厂与carrierwave上传现场

Factory.define :farm do |f| 
    f.name { Factory.next :name } 
    f.harvest '3' 
    f.offers 'Random' 
    f.latitude '43' 
    f.longitude '-70' 
    f.about 'We rocks!' 
    f.logo { Factory.next :logo } # this doesn't work 
end 

现在我只是通过字符串“#{N} .JPG”到我的标志字段,这不工作,如何评估这个领域? Im使用CarrierWave进行上传。

+1

https://github.com/jnicklas/carrierwave/wiki/How-to%3A-Use-test-fixtures – 2012-11-23 15:22:27

+1

上面的wiki页面移动到:https:// github的.com/carrierwaveuploader/carrierwave /无线ki /操作指南:-Use-test-factories – agnessa 2014-08-11 11:38:01

回答

34

您需要包括ActionDispatch::TestProcess贵厂(Rails 3中),并使用fixture_file_upload帮手:

include ActionDispatch::TestProcess 

FactoryGirl.define do 
    factory :image do 
    title "Example image" 
    file { fixture_file_upload("files/example.jpg", "image/jpeg") } 
    end 
end 

此外,一定要建立在test/fixtures/files/example.jpg示例文件,否则你会得到一个错误的文件不存在。

+0

在单元测试期间依赖外部文件的存在似乎有点可怕。无论如何要完全存根或封装文件? – 2013-12-19 14:31:50

+1

有一个测试夹具文件没有什么可怕的。只要你检查它到源代码管理它将永远在那里运行你的测试。 – 2013-12-19 20:41:28

+0

是的,可怕的是双曲线,对不起。只是想知道是否有其他选择。 – 2013-12-20 01:15:33

25

如果你不想包含ActionDispatch::TestProcess您可以添加文件,这样,

Factory.define :brand do |f| 
    f.name "My Brand" 
    f.description "Foo" 
    f.logo { Rack::Test::UploadedFile.new(File.join(Rails.root, 'spec', 'support', 'brands', 'logos', 'logo_image.jpg')) } 
end 

然后就包括给定路径的文件,在这种情况下,将spec/support/brands/logos/logo_image.jpg

这是他们如何建议在他们的wiki上做这件事https://github.com/jnicklas/carrierwave/wiki/How-to%3A-Use-test-fixtures

+2

您应该使用Rack :: Test :: UploadedFile,因为强参数不会传递文件类型。 – sheerun 2013-04-03 14:57:46

+0

谢谢sheerun,我把它从'file.open'改成了'Rack :: Test :: UploadedFile.new'。 – Ryan 2013-05-23 23:08:42