Как проверить загрузку файла в rails?


У меня есть контроллер, который отвечает за прием файлов JSON, а затем обрабатывает файлы JSON, чтобы сделать некоторое обслуживание пользователей для нашего приложения. В пользовательском тестировании загрузка и обработка файлов работает, но, конечно, я хотел бы автоматизировать процесс тестирования обслуживания пользователей в нашем тестировании. Как я могу загрузить файл на контроллер в рамках функционального тестирования?

7 96

7 ответов:

искал этот вопрос и не смог найти его или его ответ на переполнение стека, но нашел его в другом месте, поэтому я прошу сделать его доступным на SO.

каркас rails имеет функцию fixture_file_upload (рельсы 2рельсы 3,рельсы 5), который будет искать ваш каталог светильников для указанного файла и сделает его доступным в качестве тестового файла для контроллера в функциональном тестировании. Чтобы использовать его:

1) Положите ваши файл, который будет загружен в тесте в подкаталоге fixtures/files для тестирования.

2) в вашем модульном тесте вы можете получить свой тестовый файл, вызвав fixture_file_upload('path','mime-type').

например:

bulk_json = fixture_file_upload('files/bulk_bookmark.json','application/json')

3) вызовите метод post, чтобы поразить действие контроллера, которое вы хотите, передавая объект, возвращенный fixture_file_upload в качестве параметра для загрузки.

например:

post :bookmark, :bulkfile => bulk_json

или в Rails 5: post :bookmark, params: {bulkfile: bulk_json}

это будет выполняться через моделируемый процесс post с использованием копии Tempfile файла в каталоге fixtures, а затем вернуться к модульному тесту, так что вы можете начать изучение результатов поста.

ответ Мори правильный, за исключением того, что в Rails 3 вместо "ActionController::TestUploadedFile.Новый "вы должны использовать" Rack::Test:: UploadedFile.новый."

созданный объект file может быть использован в качестве значения параметра в тестах Rspec или TestUnit.

test "image upload" do
  test_image = path-to-fixtures-image + "/Test.jpg"
  file = Rack::Test::UploadedFile.new(test_image, "image/jpeg")
  post "/create", :user => { :avatar => file }
  # assert desired results
  post "/create", :user => { :avatar => file }     

  assert_response 201
  assert_response :success
end

Я думаю, что лучше использовать новый ActionDispatch:: Http:: UploadedFile таким образом:

uploaded_file = ActionDispatch::Http::UploadedFile.new({
    :tempfile => File.new(Rails.root.join("test/fixtures/files/test.jpg"))
})
assert model.valid?

таким образом, вы можете использовать те же методы, которые вы используете в своих проверках (например, tempfile).

Из Книги Rspec, B13. 0:

Rails ' предоставляет класс ActionController:: TestUploadedFile, который может использоваться для представления загруженного файла в хэше params спецификации контроллера, например:

describe UsersController, "POST create" do
  after do
    # if files are stored on the file system
    # be sure to clean them up
  end

  it "should be able to upload a user's avatar image" do
    image = fixture_path + "/test_avatar.png"
    file = ActionController::TestUploadedFile.new image, "image/png"
    post :create, :user => { :avatar => file }
    User.last.avatar.original_filename.should == "test_avatar.png"
  end
end

эта спецификация потребует, чтобы у вас был test_avatar.png-изображение в каталоге spec/fixtures. Это займет этот файл, загрузите его на контроллер, и контроллер будет создавать и сохранять реальную модель пользователя.

вы хотите использовать fixtures_file_upload. Вы поместите свой тестовый файл в подкаталог каталога fixtures, а затем передадите путь к fixtures_file_upload. Вот это код, используя приспособление для загрузки файла

Если вы используете тест рельсов по умолчанию с фабричной девушкой. Штраф ниже кода.

factory :image_100_100 do
    image File.new(File.join(::Rails.root.to_s, "/test/images", "100_100.jpg"))
end

Примечание: Вы должны будете держать фиктивное изображение в /test/images/100_100.jpg.

Он отлично работает.

Ура!

Если вы получаете файл в контроллере со следующим

json_file = params[:json_file]
FileUtils.mv(json_file.tempfile, File.expand_path('.')+'/tmp/newfile.json')

затем попробовать следующие технические характеристики:

json_file = mock('JsonFile')
json_file.should_receive(:tempfile).and_return("files/bulk_bookmark.json")
post 'import', :json_file => json_file
response.should be_success

это сделает поддельный метод методом 'tempfile', который вернет путь к загруженному файлу.