Ich habe Modell Person, die viele Bilder hat, wobei Bilder ein Büroklammer-Anhangsfeld namens Daten haben, eine abgekürzte Version, die unten angezeigt wird:
class Person
has_many :images
...
end
class Image
has_attached_file :data
belongs_to :person
...
end
Der Person muss mindestens ein Bild beigefügt sein.
Bei der Verwendung von FactoryGirl habe ich folgenden Code:
Factory.define :image do |a|
a.data { File.new(File.join(Rails.root, 'features', 'support', 'file.png')) }
a.association :person
end
Factory.define :person do |p|
p.first_name 'Keyzer'
p.last_name 'Soze'
p.after_create do |person|
person.assets = [Factory.build(:image, :person => person)]
end
# p.images {|images| [images.association(:image)]}
end
(Hinweis: Ich habe auch versucht, dass der oben auskommentierte Code ebenfalls ausprobiert wurde.) Die meiste Zeit, wenn ich Gurkenfunktionen ausführe, wird eine Fehlermeldung angezeigt, die der folgenden ähnelt:
Keine solche Datei oder kein solches Verzeichnis - /tmp/stream,9887,0.png (Errno :: ENOENT)
...
Manchmal laufen die Tests erfolgreich.
Kann mir jemand sagen, was das Problem ist, das ich hier habe, oder wie sie FactoryGirl und Paperclip zusammen verwenden, um so etwas wie das zu erreichen, was ich erreichen möchte?
Ich benutze Rails 3.
Antworten:
Sie können fixture_file_upload verwenden
include ActionDispatch::TestProcess
In Ihrem Testhelfer finden Sie hier eine Beispielfabrik:Im obigen Beispiel
spec/photos/test.png
muss es im Stammverzeichnis Ihrer Anwendung vorhanden sein, bevor Sie Ihre Tests ausführen.Beachten Sie , dass
FactoryBot
ein neuer Name für istFactoryGirl
.quelle
{ }
sind erforderlich. Es bricht ohne esinclude ActionDispatch::TestProcess
sollte ganz oben in der Factory-Datei außerhalb desFactoryGirl.define do...end
Blocks eingefügt werden .Neuere FG-Syntax und keine Includes erforderlich
oder noch besser,
quelle
Desmond Bowe von Pivotal Labs schlägt vor, fixture_file_upload aufgrund von Speicherverlustproblemen zu vermeiden. Stattdessen sollten Sie die Büroklammerfelder direkt in Ihrer Fabrik einstellen:
quelle
content_type
. Dafür benötigen Sie ein gültiges Dateiobjekt.Ich habe den folgenden Code verwendet:
Schienen 2
http://gist.github.com/162881
Schienen 3
https://gist.github.com/313121
quelle
quelle
Versuchen Sie es mit ActionController :: TestUploadedFile. Sie können die Dateieigenschaft einfach auf eine Instanz von TestUploadedFile setzen, und die Büroklammer sollte sich um den Rest kümmern. Beispielsweise
quelle
Die obigen Antworten können in einigen Fällen helfen, und die Antwort hat tatsächlich in einer meiner Situationen geholfen, aber bei Verwendung einer Carrierwave hat die vorherige Lösung aus dieser Frage diesmal nicht funktioniert.
ERSTE ANSATZ:
Für mich hat das Hinzufügen eines
after :create
das Problem für mich folgendermaßen gelöst:Das Einstellen der Inline-Videodatei
video_file { File.new("#{Rails.root}/spec/fixtures/sample.mp4") }
hat nicht funktioniert und es wurden Fehler gemeldet.ZWEITER ANSATZ:
Definieren Sie eine Fabrik wie diese (ändern Sie
personal_file
Ihren Anhangsnamen):Und fügen Sie diese Zeilen hinzu zu
config/environemnts/test.rb
:quelle
Was testest du genau? Diese Büroklammer wird die Datei erfolgreich anhängen? Das scheint wirklich ein Test zu sein, den eine Büroklammer durchführen sollte, nicht Ihre Bewerbung.
Hast du es versucht
Wir verwenden Machinist anstelle von factory_girl und haben gerade Dinge wie verwendet
Obwohl wir dabei nicht wirklich viel testen, möchten wir normalerweise nur ein gültiges
Image
Objekt haben.quelle