2017-12-15 22 views
2

私は機能テストを持っています。 let!(:product1) { create(:product) }FactoryGirl/Botイメージ定義

私が作成して保存するFactoryBotを使用しています:データベースに製品オブジェクトを:この機能テストでは、私は、テスト・データベースにいくつかのデータをロードする必要が

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 

そして私は私のRSpecのテストを実行します。私の見解は、私の本当のアプリでAWSからのURLからロードされている画像を1、2、などを生成する必要があるため

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

はしかし、私はエラーを取得します。しかし、私のテストでは、私はイメージをテストしていないので、私はAWSにリクエストを送信したくありません。読み込まれた画像は無関係です。私はちょうど私のapp/assets/images/test_image.jpegディレクトリにダミーイメージを持っていて、FactroyBotはそのイメージをすべてのテストに使用したいと思っていますが、私はイメージへのパスを正しく指定していないために問題を起こしていて、FactoryBotは私にエラー:

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

私はそれを動作させるためにいくつかの方法を試しました。 FactoryBotがダミーイメージを取得できるように、自分のイメージフォルダにURLを指定する適切な方法は何ですか?そしてこれはこれを行う最善の方法ですか、より良い方法ですか?

答えて

2

パスを削除するだけです。 image_tag('test_image.jpeg')のレールを使用するときはapp/assets/imagesのようになります。パブリックディレクトリにファイルを置くだけで、パイプラインを経由せずに静的に提供することもできます。

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

私が最初にパスなしで試してみました、それが動作しませんでしたが、今私はそれが原因で別のエラーで働いていませんでしたが分かりました。いずれにせよ、これは魅力のように働き、ブロックを使って工場を短縮した方法を愛しています:)。 – Darkisa

関連する問題