Ich habe ein Artwork-Modell mit einem Bildattribut, auf dem Carrierwave montiert ist. Beim Schreiben der Controller-Spezifikationen habe ich festgestellt, dass das Bildfeld leer bleibt, auch wenn ich dachte, dass ich ein Dateiobjekt übergebe.
Meine Debug-Informationen sagen mir, dass das Problem mit dem Bildattribut, auf dem CarrierWave installiert ist, und nicht mit etwas anderem verbunden ist. Ich denke nicht, dass ich die Informationen übergebe, die es braucht, aber ich weiß nicht, was ich versuchen soll.
Hier ist die Controller-Aktion mit einigen Debug-Informationen zur Identifizierung des Problems:
%Vor%Im Testprotokoll sehe ich das nach dem Ausführen meiner Spezifikationen:
%Vor%Irgendwelche Gedanken, bitte? Gibt es einen Controller-Parameter, den ich vergessen habe zu setzen?
Mein Problem war allgemeiner: Während meiner Tests (mit Rspec und FactoryGirl) übergab ich die falsche Art von Dateiobjekt an die Controller-Aktion. Dies ist die Art von Objekt, das ich für mein Bildattribut definiert habe:
%Vor%Obiges ist das Setup, das Carrierwave für FactoryGirl Test Fixtures empfohlen hat. Es funktionierte zum Testen des Modells und der meisten Controller-Aktionen, aber nicht für die Erstellungsaktion.
Meine Testprotokolle sagten mir, dass mein Bildattribut leer war, obwohl dieses Dateiobjekt übergeben wurde. Nach einigem Suchen habe ich herausgefunden, dass Sie eine Instanz von Rack :: Test :: UploadedFile übergeben können (ich denke, dass ActionDispatch :: Http :: UploadedFile das ist, was über den Browser (?) Gesendet wird).
Anstatt das Attribut image
im Werk auf File.open(...)
zu setzen, setze ich es auf Rack::Test::UploadedFile.new(Rails.root.join("spec/support/sample.gif"))
. Meine Controller-Spezifikationen wurden übergeben und der Datei-Upload wurde in der Datenbank gespeichert.
Ich denke, dies erklärt, warum viele Leute erfolgreiche Dateiuploads im Browser sehen, aber nicht in ihren Tests oder Validierungen.
Dieser Beitrag zum Testen von Dateianhängen in Rails 3 hat wirklich geholfen .
Tags und Links ruby-on-rails rspec carrierwave