2011-05-13 76 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