Wie zu set locale default_url_options für funktionale tests (Rails)
In meinem application_controller, ich habe den folgenden Satz, um das Gebietsschema enthalten alle Pfade generiert url_for:
def default_url_options(options={})
{ :locale => I18n.locale }
end
Meine Ressource Routen haben dann :path_prefix = "/:locale"
Funktioniert auf der Website.
Aber wenn es um meine funktionalen tests, die : - Gebietsschema nicht bestanden mit der generierten urls, und deshalb werden Sie alle scheitern. Ich kann es umgehen, indem die locale, um die url in meinen tests, etwa so:
get :new, :locale => 'en'
Aber ich will nicht zu haben, um manuell hinzufügen, die locale zu jedem funktionalen test.
Habe ich versucht, indem die default_url_options def oben test_helper, aber es scheint keine Wirkung haben.
Gibt es eine Möglichkeit, die ich ändern kann, die default_url_options, um das Gebietsschema enthalten, die für alle meine tests?
Dank.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Suchen durch, wie der controller TestCase generiert die url scheint es nicht zu sein, einen direkten Weg, um es mit den defualt_url_options. Der main-block, der tatsächlich die url creationg (in den tests) sieht wie folgt aus (http://github.com/rails/rails/blob/master/actionpack/lib/action_controller/test_case.rb):
Diese aufgerufen wird, wird durch die process-Methode, die wiederum rief die get -, post -, head-oder put-Methoden. Ein Weg, um vielleicht das bekommen, was Sie suchen, könnte es sein, alias_chain die process-Methode.
Werden Sie wollen zu setzen, dass der test-Helfer, die außerhalb des TestCase-Klasse, denke ich. Lassen Sie mich wissen, wie es funktioniert für Sie, ich habe nicht wirklich getestet, also werden wir sehen.
In den Schienen 3.1-stable-Zweig, der process-Methode ist jetzt innerhalb eines
Behavior
Modul. So hier ist der code, die für mich gearbeitet (geringfügig von John Duff ' s Antwort):Gemacht und ich sicher, dass dieser code aufgerufen wird, wird vor der Ausführung der specs/tests. Ein guter Ort, um es zu setzen ist in der test_helper Klasse.
module ActionDispatch::Assertions::RoutingAssertions def assert_recognizes_with_default_locale(expected_options, path, extras={}, message=nil) expected_options = { :locale => I18n.default_locale.to_s }.merge(expected_options || {} ) assert_recognizes_without_default_locale(expected_options, path, extras, message) end alias_method_chain :assert_recognizes, :default_locale end
assert_recognizes
Methode war eine cheat. In der Tat, ich glaube nicht, dass es eine gute Idee, hack Ihre Test-tools wie, dass, im Gegensatz zu mock-code, den Sie versuchen zu testen (wie ist der Fall mit dem hinzufügen einer Methode zurBehavior
- Modul).Für Schienen 5, fand ich diese einfache Lösung
In
test_helper.rb
basierend auf action_dispatch/testing/integration.rb5.1.4
.ApplicationController
für Konsistenz:ApplicationController.new.send(:default_url_options)
Falls sich jemand mit diesem mit Rails 4.0, die Reihenfolge der Argumente in der
Prozess
Methode hat sich geändert, also müssen Sie mit dieser aktualisierten patch (basierend auf @martin-carel Antwort, nur mit derhttp_method
argument bewegt, um das zweite argument):Hoffe, das hilft jemand fest auf dieses problem.
alias_method_chain
ist veraltet Schienen 5, und es scheint, das Verhalten der process-Methode hat sich verändert.Hier ist meine Modifikation von Martin Carel Antwort oben angepasst Schienen 5.
Ich bin keineswegs ein Experte in Rails oder Ruby, so dass, wenn etwas verbessert werden kann diese beantworten, lassen Sie mich wissen, und ich werde es ändern.
before :context do I18n.locale = :ca end
kann ich testen, was Gebietsschema ich brauche für jede circunstance. Mit Schienen 5.1.4.rc1if parameters[:params].nil? parameters[:params]={} end
vorunless I18n.locale.nil?....
zu vermeiden Absturz für die Anfrage ohne ParameterIch lief in dieses problem mit einer fehlerhaften Gurke testen.
Ich benutze die locales, die als Parameter in der url, d.h. http://mysite.com/home?locale=he
Was ich tun, um dies zu bewältigen ist, fallen alle locale-bezogenen Sachen aus der url, die während der Prüfung durch die Definition default_url_options abhängig von der Umgebung, die ich benutze:
Habe ich mit ein bisschen weniger invasive Lösung für dieses problem.
Der Vorteil dieser Lösung ist, dass es bedeutet, dass Sie können gelten nur für die Standard-locale-parameter auf bestimmte Testfälle, so können Sie testen, zum Beispiel die Umleitung Strategie selbst.
Dinge änderten sich wieder mit Ruby 5.1. Hier ist was für mich gearbeitet:
Integrationstests, fand ich, dass die oben genannten monkey-patch braucht, anders zu sein, das ist was für mich gearbeitet (Rails 2.3.4):
Habe ich versucht, eine Menge Beispiele, aber nur dieses hat mir geholfen. Es ist präzise und einfach. Fügen Sie das code-snippet auf den Prüfstand.rb:
Funktioniert auf Schienen 5.1.4