Beim Ausführen von Feature Rspecs wird folgende Fehlermeldung angezeigt (vollständige Ablaufverfolgung am Ende dieser Nachricht).

Puma-Ausgabe

Rack app error handling request { GET /rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSm5kbUZ5YVdGdWRITXZSM0IxTkRGRFRWQlFaVXRNYVUxaVpuQjZXVmw1UTNBMUx6RXhNR1V3TVRka01UWTVNalZrWXpkak5UQTNNamhqT1dNeE5UUmhOREl3TURjNVlXRTJaVFZtWTJNME16VmtZak5sTm1VNU4ySXhNemd3WldObFl6Z0dPZ1pGVkRvUVpHbHpjRzl6YVhScGIyNUpJajFwYm14cGJtVTdJR1pwYkdWdVlXMWxQU0pwYldGblpTNXdibWNpT3lCbWFXeGxibUZ0WlNvOVZWUkdMVGduSjJsdFlXZGxMbkJ1WndZN0JsUTZFV052Ym5SbGJuUmZkSGx3WlVraURtbHRZV2RsTDNCdVp3WTdCbFE9IiwiZXhwIjoiMjAxOS0wMS0yNVQxMToxNjoyOS40NDBaIiwicHVyIjoiYmxvYl9rZXkifX0=--db9451afdc95b292aa6a77c40e00ab0ceb687766/image.png }
#<Errno::ENOENT: No such file or directory @ rb_file_s_mtime - /path/to/rails/app/tmp/storage/va/ri/variants/Gpu41CMPPeKLiMbfpzYYyCp5/110e017d16925dc7c50728c9c154a420079aa6e5fcc435db3e6e97b1380ecec8>
(followed by the full trace at the end of this message)

Rspec-Ausgabe

Failure/Error: last_modified = ::File.mtime(path).httpdate

Errno::ENOENT:
No such file or directory @ rb_file_s_mtime - /path/to/rails/app/tmp/storage/va/ri/variants/Gpu41CMPPeKLiMbfpzYYyCp5/110e017d16925dc7c50728c9c154a420079aa6e5fcc435db3e6e97b1380ecec8
(followed by the full trace at the end of this message)

Kontext

product.image ist ein ActiveStorage-Anhang. Während des Tests wird der Teil "products / _form" gerendert und zeigt die Anhangsdatei (nämlich ein PNG-Bild) mit dem folgenden Code an: = image_tag url_for(product.image.variant(resize: "120x120")). Wenn ich diese Zeile auskommentiere, tritt der Fehler nicht mehr auf.

Der Test selbst ist jedes Mal erfolgreich, der Fehler scheint nach dem Test ausgelöst zu werden. Ich habe alle meine after Blöcke überprüft. Es scheint nach all meinen Nachblöcken zu passieren.

Die Ablaufverfolgung zeigt an, dass ActiveStorage::DiskController.serve_file die Fehler auslöst. Wird die ActiveStorage-App nicht ordnungsgemäß heruntergefahren?

Ich verwende die active_storage.service = :test Konfiguration, aber :file gibt die gleichen Fehler aus.

Bild gebrochen

Während ein Test fehlschlägt, kann ich im "ferngesteuerten" Browser sehen, dass das Bild nicht angezeigt wird und stattdessen ein defektes Bildsymbol angezeigt wird.

Ausführen der Tests

Es gibt eine Gruppe von 4 vorgestellten Tests, die das Rendern des Teils "products / _form" durchlaufen. Wenn ich die 4 Tests in zufälliger Reihenfolge durchführe, tritt der Fehler zufällig auf. Manchmal kann ich den Fehler 2 Mal sehen, manchmal 3 Mal.

Wenn ich die Tests einzeln durchführe, tritt der Fehler nie auf.

Wie ich das Bild anhänge

Dies ist der Helfer, mit dem ich die Datei an das Modell anhänge, bevor ich den Test durchführe:

path = Rails.root.join 'spec', 'support', 'fixtures', 'img1.png'
raise 'Image does not exist' unless File.exist? path

product.image.attach io: File.open(path), filename: 'image.png'

Ich habe auch versucht, diesen Helfer zu benutzen:

path = Rails.root.join 'spec', 'support', 'fixtures', 'img1.png'
raise 'Image does not exist' unless File.exist? path

blob =  ActiveStorage::Blob.create_after_upload! io: path.open, \
  filename: 'img1.png', content_type: 'image/png'
product.images.attach blob

Und dieser Helfer:

path = Rails.root.join 'spec', 'support', 'fixtures', 'img1.png'
raise 'Image does not exist' unless File.exist? path

byte_size = path.size
checksum = Digest::MD5.file(path).base64digest

blob = ActiveStorage::Blob.create_before_direct_upload!(filename: 'img1.png', \
   byte_size: byte_size, checksum: checksum, content_type: 'image/png').tap do |blob|
  ActiveStorage::Blob.service.upload(blob.key, path.open)
end

product.images.attach blob

Systemkonfiguration

Rails-Version : 5.2.2

Ruby-Version : Ruby 2.5.3p105 (2018-10-18 Revision 65156) [x86_64-linux]

Rbenv-Version : rbenv 1.1.1-39-g59785f6

Rspec-bezogene Versionen : rspec 3.8.0 - capybara 3.12.0 - Selen-Webdriver 3.141.0

Volle Spur

     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/rack-2.0.6/lib/rack/file.rb:63:in `mtime'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/rack-2.0.6/lib/rack/file.rb:63:in `serving'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/activestorage-5.2.2/app/controllers/active_storage/disk_controller.rb:42:in `serve_file'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/activestorage-5.2.2/app/controllers/active_storage/disk_controller.rb:12:in `show'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/actionpack-5.2.2/lib/action_controller/metal/basic_implicit_render.rb:6:in `send_action'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/actionpack-5.2.2/lib/abstract_controller/base.rb:194:in `process_action'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/actionpack-5.2.2/lib/action_controller/metal/rendering.rb:30:in `process_action'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/actionpack-5.2.2/lib/abstract_controller/callbacks.rb:42:in `block in process_action'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/activesupport-5.2.2/lib/active_support/callbacks.rb:132:in `run_callbacks'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/actionpack-5.2.2/lib/abstract_controller/callbacks.rb:41:in `process_action'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/actionpack-5.2.2/lib/action_controller/metal/rescue.rb:22:in `process_action'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/actionpack-5.2.2/lib/action_controller/metal/instrumentation.rb:34:in `block in process_action'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/activesupport-5.2.2/lib/active_support/notifications.rb:168:in `block in instrument'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/activesupport-5.2.2/lib/active_support/notifications/instrumenter.rb:23:in `instrument'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/activesupport-5.2.2/lib/active_support/notifications.rb:168:in `instrument'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/actionpack-5.2.2/lib/action_controller/metal/instrumentation.rb:32:in `process_action'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/actionpack-5.2.2/lib/action_controller/metal/params_wrapper.rb:256:in `process_action'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/activerecord-5.2.2/lib/active_record/railties/controller_runtime.rb:24:in `process_action'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/actionpack-5.2.2/lib/abstract_controller/base.rb:134:in `process'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/actionview-5.2.2/lib/action_view/rendering.rb:32:in `process'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/actionpack-5.2.2/lib/action_controller/metal.rb:191:in `dispatch'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/actionpack-5.2.2/lib/action_controller/metal.rb:252:in `dispatch'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/actionpack-5.2.2/lib/action_dispatch/routing/route_set.rb:52:in `dispatch'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/actionpack-5.2.2/lib/action_dispatch/routing/route_set.rb:34:in `serve'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/actionpack-5.2.2/lib/action_dispatch/journey/router.rb:52:in `block in serve'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/actionpack-5.2.2/lib/action_dispatch/journey/router.rb:35:in `each'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/actionpack-5.2.2/lib/action_dispatch/journey/router.rb:35:in `serve'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/actionpack-5.2.2/lib/action_dispatch/routing/route_set.rb:840:in `call'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/rack-2.0.6/lib/rack/tempfile_reaper.rb:15:in `call'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/rack-2.0.6/lib/rack/etag.rb:25:in `call'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/rack-2.0.6/lib/rack/conditional_get.rb:25:in `call'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/rack-2.0.6/lib/rack/head.rb:12:in `call'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/actionpack-5.2.2/lib/action_dispatch/http/content_security_policy.rb:18:in `call'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/rack-2.0.6/lib/rack/session/abstract/id.rb:232:in `context'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/rack-2.0.6/lib/rack/session/abstract/id.rb:226:in `call'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/actionpack-5.2.2/lib/action_dispatch/middleware/cookies.rb:670:in `call'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/actionpack-5.2.2/lib/action_dispatch/middleware/callbacks.rb:28:in `block in call'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/activesupport-5.2.2/lib/active_support/callbacks.rb:98:in `run_callbacks'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/actionpack-5.2.2/lib/action_dispatch/middleware/callbacks.rb:26:in `call'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/actionpack-5.2.2/lib/action_dispatch/middleware/debug_exceptions.rb:61:in `call'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/actionpack-5.2.2/lib/action_dispatch/middleware/show_exceptions.rb:33:in `call'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/railties-5.2.2/lib/rails/rack/logger.rb:38:in `call_app'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/railties-5.2.2/lib/rails/rack/logger.rb:26:in `block in call'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/activesupport-5.2.2/lib/active_support/tagged_logging.rb:71:in `block in tagged'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/activesupport-5.2.2/lib/active_support/tagged_logging.rb:28:in `tagged'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/activesupport-5.2.2/lib/active_support/tagged_logging.rb:71:in `tagged'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/railties-5.2.2/lib/rails/rack/logger.rb:26:in `call'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/actionpack-5.2.2/lib/action_dispatch/middleware/remote_ip.rb:81:in `call'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/actionpack-5.2.2/lib/action_dispatch/middleware/request_id.rb:27:in `call'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/rack-2.0.6/lib/rack/method_override.rb:22:in `call'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/rack-2.0.6/lib/rack/runtime.rb:22:in `call'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/activesupport-5.2.2/lib/active_support/cache/strategy/local_cache_middleware.rb:29:in `call'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/actionpack-5.2.2/lib/action_dispatch/middleware/executor.rb:14:in `call'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/actionpack-5.2.2/lib/action_dispatch/middleware/static.rb:127:in `call'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/rack-2.0.6/lib/rack/sendfile.rb:111:in `call'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/railties-5.2.2/lib/rails/engine.rb:524:in `call'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/rack-2.0.6/lib/rack/urlmap.rb:68:in `block in call'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/rack-2.0.6/lib/rack/urlmap.rb:53:in `each'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/rack-2.0.6/lib/rack/urlmap.rb:53:in `call'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/capybara-3.12.0/lib/capybara/server/middleware.rb:48:in `call'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/puma-3.12.0/lib/puma/configuration.rb:225:in `call'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/puma-3.12.0/lib/puma/server.rb:658:in `handle_request'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/puma-3.12.0/lib/puma/server.rb:472:in `process_client'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/puma-3.12.0/lib/puma/server.rb:332:in `block in run'
     # /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/puma-3.12.0/lib/puma/thread_pool.rb:133:in `block in spawn_thread'
     # 
     #   Showing full backtrace because every line was filtered out.
     #   See docs for RSpec::Configuration#backtrace_exclusion_patterns and
     #   RSpec::Configuration#backtrace_inclusion_patterns for more information.
     # ------------------
     # --- Caused by: ---
     # Capybara::CapybaraError:
     #   Your application server raised an error - It has been raised in your test code because Capybara.raise_server_errors == true
     #   /opt/rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/capybara-3.12.0/lib/capybara/session.rb:147:in `raise_server_error!'

Aktualisieren

(Tut mir leid, dass ich geschwiegen habe, ich musste mich um einen Notfall kümmern)

Hier ist eine interessante Information. Ich habe nach eingefügt >, dieser Code: puts "SERVING #{path} - Exist ? #{File.exist? path}"

Und hier ist die Ausgabe (beachten Sie die Dateinamen und den Booleschen Wert am Ende jeder Zeile):

SERVING /tmp/active_storage_tests20190129-10797-1rebdf7/Me/GK/MeGKkqgbb7Sg4RbPoCYWR6pZ - Exist ? true
SERVING /tmp/active_storage_tests20190129-10797-1rebdf7/sG/3v/sG3vd2viGWmaf69pNXSChZPa - Exist ? true
SERVING /tmp/active_storage_tests20190129-10797-1rebdf7/fy/2C/fy2C8PpaR96YgCzwt5WVBLrQ - Exist ? true
SERVING /tmp/active_storage_tests20190129-10797-1rebdf7/sG/3v/sG3vd2viGWmaf69pNXSChZPa - Exist ? true
. (green dot)
SERVING /tmp/active_storage_tests20190129-10797-1rebdf7/Me/GK/MeGKkqgbb7Sg4RbPoCYWR6pZ - Exist ? false
SERVING /tmp/active_storage_tests20190129-10797-1rebdf7/sG/3v/sG3vd2viGWmaf69pNXSChZPa - Exist ? false
SERVING /tmp/active_storage_tests20190129-10797-1rebdf7/Me/GK/MeGKkqgbb7Sg4RbPoCYWR6pZ - Exist ? false
SERVING /tmp/active_storage_tests20190129-10797-1rebdf7/fy/2C/fy2C8PpaR96YgCzwt5WVBLrQ - Exist ? false
F (red F)
SERVING /tmp/active_storage_tests20190129-10797-1rebdf7/Me/GK/MeGKkqgbb7Sg4RbPoCYWR6pZ - Exist ? false
SERVING /tmp/active_storage_tests20190129-10797-1rebdf7/sG/3v/sG3vd2viGWmaf69pNXSChZPa - Exist ? false
SERVING /tmp/active_storage_tests20190129-10797-1rebdf7/Me/GK/MeGKkqgbb7Sg4RbPoCYWR6pZ - Exist ? false
SERVING /tmp/active_storage_tests20190129-10797-1rebdf7/fy/2C/fy2C8PpaR96YgCzwt5WVBLrQ - Exist ? false
F (red F)
SERVING /tmp/active_storage_tests20190129-10797-1rebdf7/Tx/DL/TxDLPEk3ykf8ETkURY5YZPgY - Exist ? true

Wie wir sehen können, ist der Dateipfad auch zwischen den Tests derselbe. Die Datenbank wird zwischen den einzelnen Tests bereinigt. Es gibt also "irgendwo", wo die Dateiprüfsumme aufbewahrt wird, damit Activestorage denselben Blob-Datensatz wiederverwendet. Infolgedessen wird derselbe Dateipfad wiederverwendet, und aus diesem Grund liegt ein FileNotFound-Fehler vor.

Irgendeine Idee ? Bitte beachten Sie, dass zusätzlich zu DatabaseCleaner ein After-Block wie folgt definiert ist:

config.after(:each) do
  ActiveStorage::Current.reset
  ActiveStorage::Attachment.all.each(&:delete)
  ActiveStorage::Blob.all.each(&:delete)
end

Ich vermute einen Fehler

Füllte eine PR mit einem Antrag zur Reproduktion von https://github.com/rails/rails/issues/ 34989

Warten auf ihre Antwort

7
Benj 20 Jän. 2019 im 10:17

3 Antworten

Beste Antwort

Die Tatsache, dass der Test erfolgreich ist, bedeutet nur, dass der Test nicht davon abhängt, dass das Bild gefunden wird. Eine fehlerhafte Bildverknüpfung führt im Allgemeinen nicht dazu, dass ein Test fehlschlägt, und es ist in der Tat häufig der Fall, dass Testautoren sich nicht einmal die Mühe machen, Scheinbilder bereitzustellen, da dies (als wahrgenommen) zu viel Arbeit und für die zu testende Sache nicht relevant ist .

Leute, deshalb fragen wir nach einem Beispiel. Nachdem das OP ein Beispiel veröffentlicht hat, können wir sehen, dass sein Problem das Zwischenspeichern von Browsern ist und sein wird durch Ersetzen gelöst

product.images.attach io: File.open(path), filename: 'image.png'

Mit

product.images.attach io: File.open(path), filename: "image-#{Time.now.strftime("%s%L")}.png"

In dem Helfer, der die Befestigung macht. Ohne das Beispiel hätte ich das nicht gelöst.

Erläuterung

ActiveStorage übernimmt das Speichern und Bereitstellen von Dateien. OP speicherte und lieferte Bilder damit, wofür es definitiv gedacht war. ActiveStorage trennt die veröffentlichte URL von der tatsächlichen Image-Serving-URL, damit verschiedene Dienste Dateien auf unterschiedliche Weise bereitstellen können.

Die veröffentlichte URL ist fast ein Permalink: Es ist eine verschlüsselte Version des Datenbankschlüssels für den Anhang. ActiveStorage verarbeitet eine Anforderung für die URL, indem nachgeschlagen wird, wo die Datei gespeichert ist, und eine temporäre 302-Umleitung an die URL gesendet wird, die für den Zugriff auf die Datei verwendet werden kann, die als "Dienst-URL" bezeichnet wird. Wenn Sie AWS S3 zum Speichern von Dateien verwenden, kann die Service-URL eine signierte URL sein, die schnell abläuft, den Browser jedoch direkt mit S3 verbindet, anstatt als Vermittler den Webserver durchlaufen zu müssen.

Standardmäßig ist die Service-URL 5 Minuten lang gültig, und ActiveRecord wird explizit festgelegt

Cache-Control: max-age=300, private

Auf der 302 Weiterleitung. Der Browser speichert diese Weiterleitungsantwort im Cache und versucht in den nächsten 5 Minuten nicht einmal, die veröffentlichte URL zu verwenden oder zu überprüfen. Er ersetzt sofort die öffentliche URL durch die zwischengespeicherte Dienst-URL.

Während die öffentliche URL vorhersehbar neu erstellt wird, wird die Dienst-URL leider zufällig generiert. Wenn der Browser seine automatische Umleitung durchführt, funktioniert die zuvor gültige Dienst-URL leider nicht mehr. Die Lösung (oder Problemumgehung, abhängig von Ihrer Sichtweise) besteht darin, die öffentlichen URLs durch Einfügen eines Zeitstempels in den Dateinamen zu unterscheiden, damit Tests öffentliche URLs nicht wiederverwenden.

Nebenbemerkung

Übrigens sollten Sie url_for nicht mit image_tag verwenden. Ändern Sie Ihren ERB von

= image_tag url_for(product.image.variant(resize: "120x120"))

Zu

= image_tag(product.image.variant(resize: "120x120"))

Rails ist intelligent genug, um beide Fälle zu behandeln, aber der letztere Weg ist der empfohlene Weg.

1
Old Pro 30 Jän. 2019 im 05:00

Es stimmt wahrscheinlich nicht, wie Sie das Image einrichten, gegen das Sie testen. Möglicherweise möchten Sie dies dahingehend aktualisieren, wie das Rails-Team in eigenen Tests damit umgeht:

module ActiveStorageHelpers
  # ported from https://github.com/rails/rails/blob/5-2-stable/activestorage/test/test_helper.rb#L57
  def create_file_blob(filename: "image.jpg", content_type: "image/jpeg", metadata: nil)
    ActiveStorage::Blob.create_after_upload! io: file_fixture(filename).open, filename: filename, content_type: content_type, metadata: metadata
  end
end

RSpec.configure do |config|
  config.include ActiveStorageHelpers
end

Platzieren Sie dann eine winzige Bilddatei in spec/fixtures/file/images.jpg (dort sucht die file_fixture -Methode danach).

Mit dieser Option können Sie das Bild in Ihrem Funktionstest auf Ihrem Modell einrichten, und zwar mit folgenden Funktionen:

instance_of_model.images.attach(create_file_blob)
3
codenamev 23 Jän. 2019 im 15:27

Ich bin nicht sicher, was du meinst, mit der Ausnahme, dass nach dem Test passiert?

Der Test sollte normalerweise atomar und unabhängig sein, daher sollten alle von Ihnen erstellten Ressourcen sofort nach Abschluss Ihres Tests entfernt werden. Außerdem werden Tests in zufälliger Reihenfolge ausgeführt, sodass Tests, die aufeinander angewiesen sind, manchmal fehlschlagen - und manchmal auch nicht, abhängig von der Ausführungsreihenfolge.

Können Sie die Ausgabe oder Tests, die fehlschlagen, freigeben?

0
BvuRVKyUVlViVIc7 23 Jän. 2019 im 15:02