web-dev-qa-db-ja.com

Rspec(Rails)を使用したペーパークリップアップロードのユニットテスト

合計Rspecnoobはこちら。今夜私の最初のテストを書きます。

Imageというモデルがあります。ペーパークリップを使って、写真というファイルを添付します。標準的なもの。私はペーパークリップジェネレーターを実行しましたが、プロダクションモードとテストモードではすべて正常に動作します。

これで、image.rbというスペックファイルができました。これは次のようになります(ryanbのnifty_scaffoldジェネレーターによって作成されました)。

require File.dirname(__FILE__) + '/../spec_helper'

describe Image do

  it "should be valid" do
    Image.new.should be_valid
  end
end

このテストは失敗し、モデルの検証(つまり、validates_attachment_presence)が原因であることがわかりました。

私が得るエラーは次のとおりです。

Errors: Photo file name must be set., Photo file size file size must be between 0 and 1048576 bytes., Photo content type is not included in the list

では、テストの実行時に写真をアップロードするようにrspecに指示するにはどうすればよいですか?

私はそれが備品と関係があると推測しています....多分そうではありません。私は彼らと遊んでみましたが、運がありませんでした。記録のために、フィクスチャフォルダー内にimagesというフォルダーを作成しました。テストで使用する2つのファイルは、Rails.pngとgrid.pngという名前です)

私は次のことを試みました:

it "should be valid" do
  image = Image.new :photo => fixture_file_upload('images/Rails.png', 'image/png').should be_valid 

  # I've also tried adding stuff like this
  #image.stub!(:has_attached_file).with(:photo).and_return( true )
  #image.stub!(:save_attached_files).and_return true
  #image.save.should be_true  
end

しかし、rspecは「fixture_file_upload」が認識されないことについて不平を言っています...私はそのRspec本を手に入れることを計画しています。そして、私は答えを求めてネットをトロールしましたが、何も見つからないようです。モデルから検証を削除すると、テストデータベースにいくつかのデータが入力されるため、一部のデータは正常に機能することがわかります。

前もって感謝します、

編集:

images.ymlは次のようになります:

one:
  name: MyString
  description: MyString

two:
  name: MyString
  description: MyString
23
stephenmurdoch

これはRails 2.X:

Image.new :photo => File.new(Rails_ROOT + '/spec/fixtures/images/Rails.png')

Rails 3の時点で、Rails_ROOTは使用されなくなりました。代わりに、Rails.rootを使用する必要があります。

これはRails 3:

Image.new :photo => File.new(Rails.root + 'spec/fixtures/images/Rails.png')

間違いなくRSpecの本を手に入れてください、それは素晴らしいです。

39
chrisdinn

Rails.rootはパス名オブジェクトなので、次のように使用できます。

Image.new :photo => Rails.root.join("spec/fixtures/images/Rails.png").open

編集-おそらくRails 3 .. ..

  • @PaulRosaniaによる回答を参照してください
19
TJ Singleton

他の誰かがGoogle経由でこれを見つけた場合、Rails_ROOTはRails 3.0では無効になります。その行は次のようになります。

Image.new :photo => File.new(Rails.root + 'spec/fixtures/images/Rails.png')

(先頭のスラッシュがないことに注意してください!)

5
Paul Rosania

統合テストではmultipart_bodygemを使用しています。テストよりもBDDに少し忠実です。

http://steve.dynedge.co.uk/2010/09/19/multipart-body-a-gem-for-working-with-multipart-data/

RspecとPaperclipに関して、has_attached_file:photoディレクティブは、ある種の仮想属性を作成します。つまり、:photo ...ファイルまたはパスを写真に割り当てると、Paperclipが引き継ぎ、ファイルを保存し、オプションで処理を行います。サムネイルの自動作成、スプレッドシートのインポートなど。ペーパークリップをテストするようにrspecに指示しているわけではありません。あなたはコードを呼び出して、そのコードの結果がどうあるべきかをrspecに伝えています。

$ GEM_HOME/gems/Paperclip-2.3.8/README.rdocで、==後処理(具体的には147行目と148行目)の下のファイルの約76%:

--- [BEGIN QUOTE] ---注:プロセッサは元の添付ファイルをスタイルに変換することで動作するため、スタイルが定義されていない場合、プロセッサは実行されません。 --- [END QUOTE] ---

コードを読むと、support:original ...が表示されます。has_attached_fileはスタイルを定義していますか?

私は一般的な ":styles => {:original => {:this_key_and =>:this_value_do_not_do_anything_unless_a _lib_ Paperclip_processors__foo_dot_rb__does_something_with_them}}"を使用しています...ファイルを一時ディレクトリからhas_attached_file:pathに移動するためのペーパークリップ

それはデフォルトであるか、ドキュメントでより明白であると思うでしょう。

1
paul.belt