Как проверить загрузку файла в rails?
У меня есть контроллер, который отвечает за прием файлов JSON, а затем обрабатывает файлы JSON, чтобы сделать некоторое обслуживание пользователей для нашего приложения. В пользовательском тестировании загрузка и обработка файлов работает, но, конечно, я хотел бы автоматизировать процесс тестирования обслуживания пользователей в нашем тестировании. Как я могу загрузить файл на контроллер в рамках функционального тестирования?
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', который вернет путь к загруженному файлу.