Поддельные загрузки файлов в тестах контроллера Rails 3.1 - PullRequest
9 голосов
/ 17 октября 2011

Мой контроллер получает доступ к атрибуту 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?

Ответы [ 3 ]

14 голосов
/ 17 октября 2011

Наконец-то найдено это , что говорит о том, что хотя вещь, возвращаемая 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
3 голосов
/ 02 февраля 2013

Я обошел этот путь

upload_file = fixture_file_upload('files/stats_upload.csv', 'text/csv')
upload_file.stubs(:tempfile).returns(upload_file)
0 голосов
/ 06 ноября 2012

Я сделал запрос на удаление, чтобы исправить эту проблему, пожалуйста, +1, если вам это нравится: https://github.com/brynary/rack-test/pull/67

...