Factory with carrierwave upload field [duplicate]
Asked Answered
M

2

20

Hello i need to build up Factory for my model, for example

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

For now im just pass string "#{n}.jpg" into my logo field and this dont work, how to evalute this field? Im using CarrierWave for uploading.

Mose answered 13/5, 2011 at 10:51 Comment(2)
github.com/jnicklas/carrierwave/wiki/…Abvolt
the above wiki page moved to: github.com/carrierwaveuploader/carrierwave/wiki/…Bechler
P
35

You need to include ActionDispatch::TestProcess in your factory (Rails 3), and use the fixture_file_upload helper:

include ActionDispatch::TestProcess

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

Also be sure to create an example file at test/fixtures/files/example.jpg, otherwise you will get an error that the file does not exist.

Phenacite answered 23/12, 2011 at 0:32 Comment(3)
It seems kind of terrible to rely on the existence of an external file during a unit test. Is there anyway to completely stub or encapsulate the file?Vidicon
There's nothing terrible about having a test fixture file. As long as you check it into source control it will always be there to run your tests on.Phenacite
Yeah terrible is hyperbolic, sorry. Just wanted to know if there was an alternative.Vidicon
H
25

If you don't want to include ActionDispatch::TestProcess you can add files like this,

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

Then just include the file at that given path, in this case it would be spec/support/brands/logos/logo_image.jpg

This is how they suggest doing it on their wiki https://github.com/jnicklas/carrierwave/wiki/How-to%3A-Use-test-fixtures

Horntail answered 5/2, 2013 at 16:54 Comment(2)
You should use Rack::Test::UploadedFile, because strong parameters won't pass File type.Yusem
Thanks sheerun, I've changed it from file.open to use Rack::Test::UploadedFile.new instead.Horntail

© 2022 - 2024 — McMap. All rights reserved.