9

私のコントローラーはtempfile、アップロードされたファイルの属性にアクセスし、それを別のモック コンポーネントに渡します。私のテストコードは

  @file = mock(Object)
  @file.stub_chain(:tempfile, :path).and_return('thefile.zip')
  # ...
  post :create, :file => @file

そしてコントローラーコードは を呼び出しますparams[:file].tempfile.path

Rails 3.0 から 3.1 にアップグレードした後、上記の行が失敗し始めました。

undefined method `tempfile' for "#[RSpec::Mocks::Mock:0x2b0d9a0 @name=Object]":String

つまり、Rails 3.1 はparams[:file]自動的に文字列に変換されます。

ブラウザを介して手動でテストすると、コードは正しく機能します。使っfixture_file_uploadてみたところパラメータはFileオブジェクトになったのですが、tempfileメソッドがありませんでした。

では、Rails 3.1 で任意のモック オブジェクトをパラメーターとしてアクションに渡すにはどうすればよいでしょうか?

4

3 に答える 3

15

最終的に this が見つかりまし。これは、返されたものにfixture_file_upload@tempfileメンバーがありますが、リーダー メソッドがないことを示しています。次のように解決

  FileUtils.touch('file.zip') # fixture_file_upload needs the file to exist
  @file = fixture_file_upload('file.zip')
  class << @file
    # The reader method is present in a real invocation,
    # but missing from the fixture object for some reason (Rails 3.1.1)
    attr_reader :tempfile
  end
于 2011-10-17T14:35:54.567 に答える
3

こんなところを回りました

upload_file = fixture_file_upload('files/stats_upload.csv', 'text/csv')
upload_file.stubs(:tempfile).returns(upload_file)
于 2013-02-02T16:35:45.980 に答える
0

この問題を修正するためにプル リクエストを作成しました。よろしければ +1 してください: https://github.com/brynary/rack-test/pull/67

于 2012-11-06T13:46:08.913 に答える