2012-06-12 11 views
9

Ich hatte das folgende Problem mit der Asset-Pipeline.Rails Asset-Pipeline-Tests bestanden Produktion gebrochen

  • Ich habe eine HTML-E-Mail mit einem Bild im Inneren.
  • Ich habe Tests, die den Fall abdecken, in dem die E-Mail erfolgreich gesendet wird.
  • Alle Tests bestanden.
  • Bei der Produktion ist die Funktion, die das Senden der E-Mail erfordert, fehlerhaft, weil das HTML-Layout auf ein nicht vorhandenes Bild verweist.

Dies gilt natürlich für alle vorkompilierten Assets.

Es scheint mir, dass Tests plötzlich nicht mehr zuverlässig sind. Gibt es einen Weg, diese Situation zu vermeiden, um erneut zu passieren?

+0

Haben Sie test env so konfiguriert, dass vorkompilierte Assets verwendet werden? – shigeya

+0

meinst du "config.assets.compile = false"? Wenn ich das tue, muss ich Assets jedes Mal vorkompilieren, wenn ich Tests durchführe. Ist das eine mögliche Lösung? –

Antwort

12

Ich fand die perfekte Lösung aus meinem eigenen Fall. Wenn Sie in der Testumgebung

festlegen, basieren Ihre Tests auf vorkompilierten Assets.

Da es nervig ist, jedes Mal während schneller Entwicklungs- und Testphasen Assets vorkompilieren zu müssen, ist es in meinem Fall ausreichend, diese Konfiguration nur auf CI zu haben.

Sie können Setup ein initializer genannt ci_config.rb mit den folgenden:

if ENV['CI'] 
    class YourApp::Application 
    config.assets.compile = false 
    config.assets.digest = true 
    end 
end 

und konfigurieren Sie CI Rake Assets auszuführen: precompile auf Start und Harke Vermögen: sauber auf Ende.

+1

Das ist genial. Vielen Dank. – Pezholio

2

Vergleichen Sie die Standard-Konfigurationsoptionen in application.rb, production.rb und development.rb, und lesen Sie Configuring Rails Applications in Ruby on Rails Guide, um Optionen zu lernen.

Wichtige Optionen sind folgende:

config.serve_static_assets: setzen Sie sich auf false (Produktion Standard), dann, Schienen nicht statische Inhalte dienen.

config.assets.compile: ob Assets mit Asset-Pipeline kompilieren, um bei Bedarf zu kompilieren.

Wenn Sie über zwei Optionen auf false setzen (das ist der Standard für die Produktion), dann müssen Sie 1) vorkompilieren und statische Inhalte an den richtigen Stellen platzieren, 2) konfigurieren Webserver (Apache oder Nginx, möglicherweise) zu dienen statische Inhalte nach Bedarf.

Für die Produktion müssen Sie nicht nur die Dateien platzieren, sondern auch den Webserver konfigurieren, um sie zu bedienen ODER Sie können serve_static_assets konfigurieren, um Assets on-the-fly zu erstellen. Möglicherweise müssen Sie die Testkonfiguration anpassen, aber für den Test ist serve_static_assets wahr, es sei denn, Sie ändern sie.

+0

danke für die Antwort, aber ich suchte nach einer Antwort, die sich darauf konzentrierte, wie man eine Testpraxis einrichtet, um zu vermeiden, dass der beschriebene Fall erneut auftritt. –

+0

@shigeya, das Problem war, dass sich Testumgebung und Produktionsumgebungskonfigurationen in Bezug auf die Asset-Pipeline unterscheiden.Stellen Sie sich vor, Sie haben Ihren Assets eine neue Javascript-Datei hinzugefügt, aber vergessen, den Dateinamen in das Array config.assets.precompile aufzunehmen. In diesem Fall würden Tests bestehen (mit config.assets.compile = true), aber die Produktion würde fehlschlagen (config.assets.compile = false). Die Frage war also nicht, wie die Asset-Pipeline zu verwenden ist, sondern wie Produktions- und Testumgebungen gleichermaßen funktionieren. Die Antwort von Fabrizio ist eine mögliche Abhilfe für dieses spezielle Problem. – Grimmo

+0

Danke für den Kommentar. Ich denke, Ihre Vermutung ist richtig für Fabrizios Fall. Für meine Situation habe ich das Array config.assets.precompile konfiguriert. Das könnte ein anderer Grund sein. Ich kann das nicht mehr reproduzieren, daher kann ich das nicht bestätigen. – shigeya

Verwandte Themen