Ich habe einen Controller, der für das Akzeptieren von JSON-Dateien zuständig ist und dann die JSON-Dateien verarbeitet, um eine Benutzerwartung für unsere Anwendung durchzuführen. Im Benutzer-Test funktioniert das Hochladen und Verarbeiten der Datei, aber natürlich würde ich gerne den Testprozess der Benutzer-Wartung in unseren Tests automatisieren. Wie kann ich im Rahmen des Funktionstests eine Datei auf einen Controller hochladen?Wie kann ich einen Datei-Upload in Rails testen?
Antwort
Gesucht wurde diese Frage und ich konnte sie nicht finden, oder ihre Antwort auf Stack Overflow, aber ich fand sie woanders, also möchte ich sie auf SO verfügbar machen.
Die Schienen Rahmen hat eine Funktion fixture_file_upload (Rails 2Rails 3, Rails 5), das Fixtures Verzeichnis für die angegebene Datei suchen und wird es als eine Testdatei für den Controller in der Funktionsprüfung zur Verfügung stellen. Um es zu verwenden:
1) Legen Sie Ihre Datei in den Test in Ihrem Fixtures/Files-Unterverzeichnis zum Testen hochgeladen.
2) In Ihrem Komponententest können Sie Ihre Testdatei durch Aufruf von fixture_file_upload ('Pfad', 'MIME-Typ') abrufen.
z.B .:
bulk_json = fixture_file_upload('files/bulk_bookmark.json','application/json')
3) die Post-Methode aufrufen, die Controller-Aktion Sie zu schlagen, um das Objekt von fixture_file_upload als Parameter für den Upload wieder vorbei.
zB:
post :bookmark, :bulkfile => bulk_json
Oder in Rails 5: post :bookmark, params: {bulkfile: bulk_json}
Dies wird den simulierten Post-Prozess unter Verwendung einer Tempfile Kopie der Datei in Ihrem Armaturen Verzeichnis durchlaufen und dann auf das Gerät zurückgeben testen, damit Sie mit den Ergebnissen des Beitrags beginnen können.
Sie möchten fixtures_file_upload verwenden. Sie werden Ihre Testdatei in ein Unterverzeichnis des Fixtures-Verzeichnisses legen und dann den Pfad zu fixtures_file_upload übergeben. Hier ist ein example of code, mit Befestigungsdatei
Vom Rspec Buch hochladen, B13.0:
Rails' bietet eine Action :: TestUploadedFile Klasse, die verwendet werden kann, eine hochgeladene Datei im params-Hash ein darzustellen Controller-Spezifikation, wie folgt:
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
Diese Spezifikation würde erfordern, dass Sie ein Bild test_avatar.png im Verzeichnis spec/fixtures haben. Es würde diese Datei nehmen, sie auf den Controller hochladen, , und der Controller würde ein echtes Benutzermodell erstellen und speichern.
Ich bekomme eine "nicht initialisierte Konstante ActionController :: TestUploadedFile" Fehler, wenn ich einen Test mit diesem Code ausführen. Alles andere, was ich in der Datei benötigen würde? –
Es scheint bereits in Rails 2.3 veraltet zu sein. Ab Rails 3.0 [[so geht's]] (http://apidock.com/rails/ActionDispatch/TestProcess/fixture_file_upload) mit Fixtures – Sebastialonso
wenn Sie bekommen die Datei in Ihrem Controller mit folgenden
json_file = params[:json_file]
FileUtils.mv(json_file.tempfile, File.expand_path('.')+'/tmp/newfile.json')
dann versuchen Sie folgendes in Ihren Angaben:
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
Dies wird die gefälschte Methode machen ‚tempfile‘ Methode, was den Pfad zur geladenen Datei zurückgibt.
Mori's Antwort ist korrekt, außer dass in Rails 3 anstelle von "ActionController :: TestUploadedFile.new" "Rack :: Test :: UploadedFile.new" verwendet werden muss.
Das erstellte Dateiobjekt kann dann als Parameterwert in Rspec- oder TestUnit-Tests verwendet werden.
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
Diese Methode ist eine gute Alternative, wenn sich Ihre Fixtures nicht in/test/fixtures befinden. Wenn Sie zum Beispiel dynamisch einige Dateien für die Tests generieren, befinden sie sich möglicherweise in einem/tmp-Ordner. –
Dies funktioniert auch mit Rails 4 einwandfrei. Vielen Dank! – Waseem
Ich denke, es ist besser, die neue ActionDispatch verwenden :: Http :: UploadedFile diese Weise:
uploaded_file = ActionDispatch::Http::UploadedFile.new({
:tempfile => File.new(Rails.root.join("test/fixtures/files/test.jpg"))
})
assert model.valid?
Auf diese Weise können die gleichen Methoden verwenden, können Sie in Ihrem Validierungen verwenden (wie zum Beispiel Tempdatei).
Wenn Sie Standardschienen Test mit Fabrik Mädchen verwenden. Fein unter dem Code.
factory :image_100_100 do
image File.new(File.join(::Rails.root.to_s, "/test/images", "100_100.jpg"))
end
Hinweis: Sie werden Dummy-Bild in /test/images/100_100.jpg
zu halten haben.
Es funktioniert perfekt.
Prost!
- 1. Wie kann ich komplexe Beziehungen in Rails mit RSpec testen?
- 2. Wie kann ich Ansichten in einem Rails-Plugin testen?
- 3. Wie kann ich einen AngularJS-Provider testen?
- 4. Wie kann ich einen Symfony2-Controller testen?
- 5. Wie kann ich einen Finalizer testen?
- 6. Wie kann ich einen Filter testen?
- 7. Wie kann ich verschiedene App-Konfigurationen in Rails testen?
- 8. Wie kann ich in Rails nach "objects_to" und "has_many" testen?
- 9. So testen Sie Dateiupload mit Jasmine BDD
- 10. Wie soll ich meine Rails App testen?
- 11. PHP: Wie kopiere ich einen temporären Dateiupload an mehrere Orte?
- 12. Wie kann ich eine Rails-App mit WGET testen?
- 13. Wie kann ich einen Dienst in symfony2 testen?
- 14. Wie kann ich Datenbankmigrationen testen?
- 15. CSRF-Token kann nicht für einen jQuery-Dateiupload überprüft werden, nur IE 9, Rails 3 App
- 16. Rails 4 - Wie schreibe ich einen Bereich
- 17. Wie kann ich Leistungsoptimierungen in C testen?
- 18. Wie kann ich Stunnel testen?
- 19. Selenium WebDriver mit Java: Testen einer Dateiupload-Site
- 20. Wie kann ich ModelState testen?
- 21. Wie kann ich einen MTOM-Webservice mit soapUI testen?
- 22. Wie kann ich einen Ländernamen in Rails bekommen?
- 23. Wie kann ich $ watch in Winkel testen
- 24. Wie kann ich Ereignisse in eckigen testen?
- 25. Wie schreibe ich einen Bereich in Rails?
- 26. Wie soll ich einen Code-Generator testen?
- 27. Wie Benutzer Dateiupload in ASP.Net MVC2
- 28. Wie kann ich EJB 3.0 testen?
- 29. Rails: Testen der Migrationsdatei
- 30. Wert in Dateiupload-Steuerelement beibehalten
Dies funktioniert nicht auf Schienen 3. Die action_controller/test_process-Datei ist nicht in activesupport 3 scheint es. Ich habe eine neue Frage für das gleiche hier geöffnet - http://StackOverflow.com/Questions/3966263/attachment-fu-testing-in-Rails-3 – Chirantan
Der Link in Ihrer Antwort ist 404, oder ist es nur für mich? – Ernest
Daumen hoch & vielen Dank! –