2012-10-22 2 views
5

Mam umieścić następujący kod w moim pliku config/environments/test.rb:Ustawianie default_url_options w środowisku testowym nie wydają się działać

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

jednak gdy uruchomię moich testów, wszystkie trasy używać http://test.host. Próbuję pracować z interfejsem API, który nie zaakceptuje http://test.host jako poprawnego identyfikatora URI wywołania zwrotnego, więc muszę to zmienić, aby poprawnie odebrać odpowiedź interfejsu API. Masz pomysł, dlaczego to nie działa? (Używam RSpec, Guard i Spork w moim pakiecie testowym).

EDYCJA: Prawdopodobnie istotne - odbywa się to w specyfikacji kontrolera.

EDIT2: Wygląda na to, że zmienia się ona po wniosek został złożony przez get, post itp Running następujący kod w teście:

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

da następujący wynik:

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

Odpowiedz

10

Obecnie można po prostu ustawić je w test.rb tak:

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

Potwierdzone działanie w Rails 3.0 – parhamr

+0

Akceptowanie na podstawie komentarza @ parhamr. – Nick

0

W jaki sposób przeprowadzasz testy? Być może dołączenie RAILS_ENV=test może pomóc.

+0

Co masz na myśli przez dodanie 'RAILS_ENV = test'? 'ENV [" RAILS_ENV "]' to '" test "' już.Jak już wspomniałem, przeprowadzam testy z RSpec, Guard i Spork. Po prostu uruchamiam 'bundle exec guard' i ładuje on serwer Spork, który automatycznie uruchamia testy RSpec. – Nick

0

Z mojego doświadczenia wynika, że ​​url_options nie przejdzie na testy bez odrobiny hakowania.

Zobacz np.

ja często napotkał ten problem, gdy próbuje ustawić ustawienia regionalne w testach. Nigdy jednak nie używałam akcji mailer, więc może być prostszy sposób na zrobienie tego.

Rozwiązaniem, które znalazłem przy ustawianiu domyślnego ustawienia narodowego w url_options, jest tylko patch actiondispatch i zmuszenie go do użycia dowolnego ustawienia narodowego, jakiego chcę. Można dostosować to do sprawy w ten sposób:

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 

mogę umieścić ten kod w pliku w specyfikacji/support więc używany w testach rspec i ja również tego wymagają od mojego pliku env.rb więc mogę używać w testach ogórka.

Należy pamiętać, że będzie to jej załatać wszędzie, zarówno w kodzie testowym i w rzeczywisty kod uruchomiony w ramach testów i będzie zastąpić inne ustawienia dla klucza :host że próby przekazania w (od scala krosowych poprawka w górnej części opcji przekazanych do url_for). W twoim przypadku uważam, że nie powinno to stanowić problemu.

Łata małpa nie jest bardzo eleganckim rozwiązaniem, i użyłem tego po tym, jak wszystko inne zawiodło. Możesz znaleźć prostsze rozwiązanie, specyficzne dla działania programu pocztowego.