119

多くの画像を持つモデル Person があり、画像には data と呼ばれる Paperclip 添付ファイル フィールドがあり、その省略形を以下に示します。

class Person
  has_many :images
  ...
end

class Image
  has_attached_file :data
  belongs_to :person
  ...
end

Person には少なくとも 1 つの画像が添付されている必要があります。

FactoryGirl を使用する場合、次のようなコードがあります。

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

(注: 上記でコメントアウトされたコードも試しました) ほとんどの場合、cucumber 機能を実行すると、次のようなエラーが発生します。

そのようなファイルまたはディレクトリはありません - /tmp/stream,9887,0.png (Errno::ENOENT)

...

場合によっては、テストが正常に実行されることがあります。

私がここで抱えている問題や、FactoryGirl と Paperclip を一緒に使用して、私が達成しようとしているようなことを達成する方法を誰か教えてもらえますか?

Rails3を使用しています。

4

8 に答える 8

89

Fixture_file_uploadを使用できます

include ActionDispatch::TestProcessテスト ヘルパーのファクトリの例を次に示します。

include ActionDispatch::TestProcess

FactoryBot.define do
  factory :user do
    avatar { fixture_file_upload(Rails.root.join('spec', 'photos', 'test.png'), 'image/png') }
  end
end

上記の例でspec/photos/test.pngは、テストを実行する前にアプリケーションのルート ディレクトリに存在する必要があります。

FactoryBotの新しい名前であることに注意してくださいFactoryGirl

于 2012-04-02T21:06:22.217 に答える
49

新しい FG 構文でインクルードは不要

factory :user do
  avatar { File.new(Rails.root.join('app', 'assets', 'images', 'rails.png')) }
end

または、さらに良いことに、

factory :user do
  avatar { File.new("#{Rails.root}/spec/support/fixtures/image.jpg") } 
end
于 2013-06-28T02:52:13.057 に答える
25

以下の要点のコードを使用しています。

レール 2

http://gist.github.com/162881

レール3

https://gist.github.com/313121

于 2010-08-02T19:09:00.127 に答える
12
file { File.new(Rails.root.join('spec', 'fixtures', 'filename.png')) }
于 2010-10-29T06:13:41.073 に答える
4

ActionController::TestUploadedFile を使用してみてください。file プロパティを TestUploadedFile のインスタンスに設定するだけで、あとは paperclip が処理します。例えば

valid_file = File.new(File.join(Rails.root, 'features', 'support', 'file.png'))  
p.images { 
   [
     ActionController::TestUploadedFile.new(valid_file, Mime::Type.new('application/png'))
   ] 
}
于 2010-07-22T22:32:17.810 に答える
0

場合によっては上記の回答が役立つ場合があり、私の状況の 1 つで実際に役立ちましたが、Carrierwave を使用している場合、この質問の以前の解決策は今回はうまくいきませんでした。

最初のアプローチ:

私にとってafter :createは、次のように問題を解決しました:

after :create do |b|
  b.update_column(:video_file, File.join(Rails.root, 'spec', 'fixtures', 'sample.mp4'))
end

インライン ビデオ ファイルのような設定video_file { File.new("#{Rails.root}/spec/fixtures/sample.mp4") }がうまくいかず、エラーが報告されていました。

2 番目のアプローチ:

次のようにファクトリを定義します (personal_file添付ファイル名に変更します)。

FactoryGirl.define do
  factory :contact do
    personal_file { File.new("#{Rails.root}/spec/fixtures/personal_files/my_test_file.csv") }
    personal_file_content_type 'text/csv'

  end
end

そして、これらの行をに追加しますconfig/environemnts/test.rb:

config.paperclip_defaults = {
  url: "#{Rails.root}/spec/fixtures/:attachment/:filename",
  use_timestamp: false
}
于 2016-12-29T10:00:43.647 に答える
-1

正確には何をテストしていますか?そのペーパークリップはファイルを正常に添付しますか? これは、アプリケーションではなく、ペーパークリップが処理する必要があるテストのようです。

やってみました

a.data { File.join(Rails.root, 'features', 'support', 'file.png') }

factory_girl の代わりに Machinist を使用し、次のようなものを使用しました

Image.blueprint do
  image { RAILS_ROOT + 'spec/fixtures/images/001.jpg' }
end

ただし、これを行う場合、実際にはあまりテストしていません。通常は、有効なImageオブジェクトが必要なだけです。

于 2010-07-22T23:07:49.890 に答える