23

合計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
4

4 に答える 4

39

これは 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 の本を手に入れてください。素晴らしいです。

于 2010-02-13T14:59:24.880 に答える
19

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

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

編集 - おそらくRails 3では動作しません...

  • @Paul Rosaniaの回答を参照してください
于 2010-06-07T20:14:37.587 に答える
5

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

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

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

于 2010-06-04T02:32:42.310 に答える
1

統合テストで multipart_body gem を使用しています。テストよりも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 が引き継ぎ、ファイルを保存し、オプションで auto などの処理を行います-サムネイルの作成、スプレッドシートのインポートなど。ペーパークリップをテストするようにrspecに指示していません。コードを呼び出して、そのコードの結果がどうあるべきかをrspecに伝えています。

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

---[ BEGIN 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 にファイルを移動するだけです

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

于 2011-01-12T02:39:10.787 に答える