2012-10-22 4 views
5

ich den folgenden Code in meine config/environments/test.rb Datei gesetzt haben:Einstellung default_url_options in Testumgebung scheint nicht zu funktionieren

config.action_mailer.default_url_options = { :host => "localhost:3000" } 

aber wenn ich meine Tests ausführen, werden alle Routen verwenden http://test.host. Ich versuche, mit einer API zu arbeiten, die http://test.host nicht als gültigen Rückruf-URI akzeptiert, also muss ich dies ändern, um die API-Antwort richtig zu erhalten. Irgendeine Idee, warum das nicht funktioniert? (Ich verwende RSpec, Guard und Spork in meiner Testsuite).

EDIT: Möglicherweise relevant - dies wird innerhalb einer Controller-Spezifikation durchgeführt.

EDIT2: Es scheint, dass sie sich ändert, nachdem eine Anfrage über get gemacht wird, post usw. Das Ausführen des folgenden Code innerhalb des Test:

Rails.logger.debug users_url 
get 'http://google.com' 
Rails.logger.debug users_url 

würde erzeugen die folgende Ausgabe:

http://localhost:3000/users 
...get request related response here 
http://google.com/users 

Antwort

10

Heute können Sie einstellen, sie nur in Ihrem test.rb wie so:

Rails.application.routes.default_url_options[:host]= 'localhost:3000' 
+0

Bestätigte Arbeit in Rails 3.0 – parhamr

+0

Akzeptieren basierend auf @ Parhamrs Kommentar. – Nick

0

Wie führen Sie Ihre Tests durch? Vielleicht kann das Anhängen RAILS_ENV=test helfen.

+0

Was meinen Sie durch Anhängen von 'RAILS_ENV = test'? 'ENV [" RAILS_ENV "]' ist '" test "' schon.Wie gesagt, ich führe die Tests mit RSpec, Guard und Spork durch. Ich starte nur 'bundle exec guard' und es lädt den Spork-Server, der automatisch die RSpec-Tests ausführt. – Nick

0

Aus meiner Erfahrung, wird nicht in Tests ohne ein bisschen Hacking bestanden werden.

Siehe z.B.

ich häufig auf dieses Problem haben, wenn das Gebietsschema in Tests zu setzen versuchen. Ich habe jedoch noch nie Action-Mailer benutzt, also könnte es einen einfacheren Weg geben.

Die Lösung, die ich gefunden habe, um das Standardgebietsschema in url_options zu setzen, ist nur patch actiondispatch und erzwingen Sie es, welches Gebietsschema ich es verwenden möchte. Man könnte dies für Ihren Fall auf diese Weise anpassen:

class ActionDispatch::Routing::RouteSet 
    def url_for_with_default_url_options(options) 
    url_for_without_default_url_options(options.merge(:host => "localhost:3000")) 
    end 

    alias_method_chain :url_for, :default_url_options 
end 

ich diesen Code in einer Datei in spec/Unterstützung setzen, so dass es in rspec Tests verwendet wird, und ich benötige es auch von meiner env.rb-Datei, so kann ich es auch in Gurkenversuchen.

Beachten Sie, dass diese es überall Patch wird, in beiden Testcode und in eigentlichen Code unter Tests ausgeführt wird, und es wird keine weiteren Einstellungen für den :host Schlüssel überschreiben, die Sie versuchen, in einen Pass zu spielen (da die Patch-Merges das Update über die Optionen, die an url_for übergeben wurden). In Ihrem Fall glaube ich, dass das kein Problem sein sollte.

Monkey Patching ist keine sehr elegante Lösung, und ich nutzte dies, nachdem alles andere fehlgeschlagen ist. Möglicherweise finden Sie eine einfachere Lösung speziell für Action Mailer.

Verwandte Themen