2013-05-11 11 views
6

Sto provando a testare la mia applicazione con cetriolo e capibara. Ho la seguente definizione step:Capybara FactoryGirl Carrierwave non può allegare file

Given(/^I fill in the create article form with the valid article data$/) do 
    @article_attributes = FactoryGirl.build(:article) 
    within("#new_article") do 
    fill_in('article_title', with: @article_attributes.title) 
    attach_file('article_image', @article_attributes.image) 
    fill_in('article_description', with: @article_attributes.description) 
    fill_in('article_key_words', with: @article_attributes.key_words) 
    fill_in('article_body', with: @article_attributes.body) 
    end 

mia fabbrica articolo simile a questo:

FactoryGirl.define do 
    factory :article do 
    sequence(:title) {|n| "Title #{n}"} 
    description 'Description' 
    key_words 'Key word' 
    image { File.open(File.join(Rails.root, '/spec/support/example.jpg')) } 
    body 'Lorem...' 
    association :admin, strategy: :build 
    end 
end 

E questo è il mio file uploader:

# encoding: UTF-8 
class ArticleImageUploader < CarrierWave::Uploader::Base 
    storage :file 
    def store_dir 
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" 
    end 
    def extension_white_list 
    %w(jpg jpeg gif png) 
    end 
end 

Ma ogni volta che faccio funzionare questo scenario ricevo il messaggio ERRORE:

Given I fill in the create article form with the valid article data # features/step_definitions/blog_owner_creating_article.rb:1 
     cannot attach file, /uploads/article/image/1/example.jpg does not exist (Capybara::FileNotFound) 
     ./features/step_definitions/blog_owner_creating_article.rb:5:in `block (2 levels) in <top (required)>' 
     ./features/step_definitions/blog_owner_creating_article.rb:3:in `/^I fill in the create article form with the valid article data$/' 
     features/blog_owner_creating_article.feature:13:in `Given I fill in the create article form with the valid article data' 

Ho anche trovato che FactoryGirl restituisce image:nil quando eseguo FactoryGirl.build(:article) nella console di test delle mie guide.

Qualcuno potrebbe spiegarmi che cosa sto sbagliando, per favore?

risposta

10

è necessario passare il percorso in diretta:

attach_file('article_image', File.join(Rails.root, '/spec/support/example.jpg')) 

Quello che sta succedendo qui è che attach_file si aspetta una stringa, non un uploader CarrierWave. Quando si passa un uploader (@article_attributes.image), attach_file sta chiamando Uploader#to_s, che chiama Uploader#path. Poiché non hai ancora salvato l'articolo, il percorso in cui verrà posizionata l'immagine non è valido.

Nota anche che chiamare la tua variabile @article_attributes è confuso, poiché è in realtà un oggetto articolo completo, non solo un hash. Se è quello che vuoi, prova a provare FactoryGirl.attributes_for(:article).

+0

Thaks per rispondere! Ho provato a usare '@article_attributes = FactoryGirl.attributes_for (: article)' come hai detto tu. Ma '@article_attributes [: image]' restituisce '# '. C'è un modo per trasformare questo nel percorso di stringa diretto? ' –

+0

' @article_attributes [: image] .path'? Sarebbe un mondo pazzo se non ci fosse modo [di ottenere il percorso da un oggetto File] (http://ruby-doc.org/core-2.0/File.html#method-i-path). – Taavo

+0

GRAZIE MOLTO! Ogni cosa funziona ora. –