Mam model Person, który ma wiele obrazów, w których obrazy mają pole załącznika Spinacz o nazwie dane, skróconą wersję wyświetlaną poniżej:
class Person
has_many :images
...
end
class Image
has_attached_file :data
belongs_to :person
...
end
Osoba musi mieć dołączony co najmniej jeden obraz.
Korzystając z FactoryGirl, mam kod podobny do następującego:
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
(Uwaga: wypróbowałem również kod skomentowany powyżej). W większości przypadków, gdy uruchamiam funkcje ogórka, pojawia się błąd podobny do następującego:
Brak takiego pliku lub katalogu - /tmp/stream,9887,0.png (Errno :: ENOENT)
...
Czasami testy przebiegają pomyślnie.
Czy ktoś może mi powiedzieć, jaki mam tutaj problem lub w jaki sposób używają razem FactoryGirl i Paperclip, aby osiągnąć coś takiego, co próbuję osiągnąć?
Używam Rails 3.
Odpowiedzi:
Możesz użyć fixture_file_upload
include ActionDispatch::TestProcess
w twoim pomocniku testowym, oto przykładowa fabryka:W powyższym przykładzie
spec/photos/test.png
musi istnieć w katalogu głównym aplikacji przed uruchomieniem testów.Uwaga,
FactoryBot
to nowa nazwa dlaFactoryGirl
.źródło
{ }
są wymagane. Bez tego sięinclude ActionDispatch::TestProcess
należy umieścić na samym początku pliku fabrycznego, poza tymFactoryGirl.define do...end
bloku.Nowsza składnia FG i brak konieczności dołączania
Lub jeszcze lepiej,
źródło
Desmond Bowe z Pivotal Labs sugeruje unikanie fixture_file_upload z powodu problemów z wyciekiem pamięci. Zamiast tego powinieneś ustawić pola spinaczy bezpośrednio w swojej fabryce:
źródło
content_type
. Do tego potrzebny jest prawidłowy obiekt pliku.Użyłem kodu w istocie poniżej:
Szyny 2
http://gist.github.com/162881
Szyny 3
https://gist.github.com/313121
źródło
źródło
Spróbuj użyć ActionController :: TestUploadedFile. Możesz po prostu ustawić właściwość file na instancję TestUploadedFile, a spinacz powinien zająć się resztą. Na przykład
źródło
Powyższe odpowiedzi w niektórych przypadkach mogą pomóc, a ta faktycznie pomogła w jednej z moich sytuacji, ale podczas korzystania z Carrierwave poprzednie rozwiązanie z tego pytania tym razem nie zadziałało.
PIERWSZE PODEJŚCIE:
U mnie dodanie
after :create
rozwiązanego problemu u mnie w ten sposób:Ustawienie wbudowanego pliku wideo
video_file { File.new("#{Rails.root}/spec/fixtures/sample.mp4") }
nie zadziałało i zgłaszało błędy.DRUGIE PODEJŚCIE:
Zdefiniuj taką fabrykę (zmień
personal_file
nazwę załącznika):I dodaj te wiersze do
config/environemnts/test.rb
:źródło
Co dokładnie testujesz? Czy spinacz z powodzeniem załączy plik? To naprawdę wygląda na test, który powinien obsługiwać spinacz, a nie na twoją aplikację.
Czy próbowałeś
Używamy Machinist zamiast factory_girl i używamy takich rzeczy jak
Chociaż tak naprawdę nie testujemy zbyt wiele, kiedy to robimy, zazwyczaj chcemy mieć tylko prawidłowy
Image
obiekt.źródło