2017-12-15 6 views
2

Ich habe einen Funktionstest. In diesem Feature-Test muss ich einige Daten in der Testdatenbank laden: let!(:product1) { create(:product) }FactoryGirl/Bot Bilddefinitionen

ich FactoryBot bin mit dem erstellen und speichern: Produkt Objekt in der Datenbank:

FactoryBot.define do 
    factory :product do 
    name 'Master Coat' 
    color 'black' 
    size 'M' 
    price '870' 
    available true 
    order 1 
    image_1 '/assets/images/test_image.jpeg' 
    image_2 '/assets/images/test_image.jpeg' 
    image_3 '/assets/images/test_image.jpeg' 
    image_4 '/assets/images/test_image.jpeg' 
    image_5 '/assets/images/test_image.jpeg' 
    image_6 '/assets/images/test_image.jpeg' 
    end 
end 

Und ich betreibe meine RSpec Test:

describe 'GET #detail' do 
    it 'should return only products with a specified name' do 
     visit detail_path(name: 'Master Coat') 
    end 
    end 

Allerdings bekomme ich einen Fehler, weil meine Ansicht nach 1 Bilder zu erzeugen braucht, 2, etc., die in meiner realen Anwendung von AWS über eine uRL geladen wird. Aber in meinen Tests möchte ich keine Anfragen an AWS senden, da ich die Bilder nicht teste. Das geladene Bild ist nicht relevant. Ich möchte nur ein Dummy-Bild in meinem Verzeichnis app/assets/images/test_image.jpeg haben und FaCtroyBot dieses Bild für alle Tests verwenden, aber ich habe Probleme, es zu arbeiten, weil ich den Pfad zum Bild falsch angeben und FactoryBot gibt mir einen Fehler von:

ActionView::Template::Error: 
     The asset "assets/images/test_image.jpeg" is not present in the asset pipeline. 

Ich habe mehrere verschiedene Möglichkeiten ausprobiert, um es zum Laufen zu bringen. Was ist die richtige Methode, um die URL für meinen Bilderordner anzugeben, damit FactoryBot das Dummy-Image abrufen kann? Und ist dies der beste Weg, oder ist es ein besserer Weg?

Antwort

2

Entfernen Sie einfach den Pfad. Wenn Sie image_tag('test_image.jpeg') Schienen verwenden, schauen Sie in app/assets/images. Sie können die Dateien auch einfach in das öffentliche Verzeichnis einfügen und sie werden statisch geliefert, anstatt die Pipeline zu durchlaufen.

FactoryBot.define do 
    factory :product do 
    name 'Master Coat' 
    color 'black' 
    size 'M' 
    price '870' 
    available true 
    order 1 
    (1..6).each {|n| send "image_#{n}", 'test_image.jpeg' } 
    end 
end 
+0

Ich versuchte zunächst, ohne den Weg und es hat nicht funktioniert, aber jetzt fand ich heraus, dass es nicht wegen eines anderen Fehlers arbeitete. Auf jeden Fall funktioniert das wie ein Zauber und liebe wie du meine Factory mit einem Block gekürzt hast :). – Darkisa