should 'post method' do
post :method, :param1 => @param1, :param2 => @param2
assert_response :success
end
Nie chce aby wywolywala on podczas testu produkcyjnych zachowan. Mam w tej metodzie wywolywana prywatna metode i podczas tego testu zwracana jest prawdziwa wartosc tej metody. Czy da sie jakos zbudowac atrape dla tej metody aby nie zwracala prawdziwych wartosci. Oraz jak moge przetestowac taki routing ktory zawiera constraints?
[quote=wlodi]Kiedy testuje jedna z moich metod:
Nie chce aby wywolywala on podczas testu produkcyjnych zachowan. Mam w tej metodzie wywolywana prywatna metode i podczas tego testu zwracana jest prawdziwa wartosc tej metody. Czy da sie jakos zbudowac atrape dla tej metody aby nie zwracala prawdziwych wartosci. Oraz jak moge przetestowac taki routing ktory zawiera constraints?[/quote]
Jeśli dobrze rozumiem chodzi ci o: http://rspec.info/documentation/mocks/stubs.html
Witam, chodzi mi o testy funkcjonalne kontrolera. Kiedy testuje metode zwraca mi ona prawdziwe zapytania. W tym momencie requesty do serwera. Jak moge odzwierciedlic takie requesty aby byly najbardziej wiarygodne podczas testow? Stubs bjest ok ale nie mozna chyba uzywac dla testowania metod ktora sama wykorzystuje metode prywatna. Wlasnie ta prywatna metode chce jakos przetworzyc aby nie zwracala mi prawdziwych wartosci podczas testowania.
Metoda make_request tworzy callbacki do serwerow za pomoca gemu Typhoeus jak ponizej w kodzie. Chcialbym to jakos sprowadzic do makiety aby nie wywolywac prawdziwych callbackow do serwera podczas testow.
Gdy testuje metode w tescie funkcjonalnym serialowy_swiat prywatna metoda wywoluje prawdziwe callbacki.
[code]setup do @param1 = “notofferid”
end
should ‘post serialowy_swiat’ do
post :serialowy_swiat, :param1 => @param1, :param2 => @param2
assert_response :success
end[/code]
ale niestety caly czas podczas testow pojawia mi sie komunikat:
test:post serialowy_swiat. (SerialowyControllerTest):
ActionView::MissingTemplate: Missing template serialowy/serialowy_swiat with {:handlers=>[:erb, :rjs, :builder, :rhtml, :rxml], :formats=>[:html], :locale=>[:en, :en]} in view paths "/home/wlodi/serialowy/app/views"
test/functional/serialowy_controller_test.rb:14:in `block (2 levels) in <class:SerialowyControllerTest>'
Nie wiem jak napisac makiete dla tej metody ktora zwraca :render :nothing => true
Jak używasz Typhoeus to nie stubuj metody make_request, bo to za dużo bezsensownej roboty. Zamiast tego skorzystaj z metod w Hydrze do stubbowanie poszczególnych zapytań http - https://github.com/dbalatero/typhoeus
post :serialowy_swiat, :param1 => @param1, :param2 => @param
make_request korzysta z url ktore nie chcialbym wywolywac podczas testowania, dlatego chcialbym stubowac metode make_request. Mam kilka metod ktore korzystjaja z metody make_request.
Czy musze nadpisac ta metode w w tescie funkcjonalnym? Jest taka koniecznosc?
Jest jakas mozliwosc aby naprzyklad w bloku setup testow funkcjonalnych stubowac ta metode bez koniecznosci jej nadpisywania?
render :nothing => true
redirect
render :text[/quote]
Ta metoda nie zwraca wartosci tylko wykonuje te polecenia. Jesli ja stubujesz to właściwie nic się w kontrolerze nie dzieje i dlatego probuje renderować domyslny widok.
Spróbuj uprościć make_request w ten sposob, że albo zwroci url na ktory ma byc redirect albo rzuci ospowiedni wyjatek. Pózniej ten wyjatek obsłuż za poca rescue_from.
Pozatym nie jestem przekonany czy make_request powinna byc kontrolerze. Może powinna byc w jakims oddzielnym modelu (cos w rodzaju proxy). Dzieki temu łatwiej tez bedzie ja przetestowac
Error:
test: posts_serialowy_swiat should post serialowy_swiat. (SerialowyControllerTest):
RuntimeError: ActionController::RackDelegation#status= delegated to @_response.status=, but @_response is nil: #<SerialowyController:0xb4383ec @action_has_layout=true, @view_context_class=nil, @_headers={“Content-Type”=>“text/html”}, @_status=200>
app/controllers/serialowy_controller.rb:161:in block in make_request' app/controllers/serialowy_controller.rb:174:inmake_request’
test/functional/serialowy_controller_test.rb:11:in `block (2 levels) in class:SerialowyControllerTest’[/code]
Po czesci jest dobrze, metoda make_request korzysta z mojego testowego url ale wciaz zwraca mi blad.
if response.success?
log_action("Server response: #{response.body}")
landing_page.blank? ? (render :nothing => true) : (redirect_to landing_page)
elsif response.timed_out?
log_action("Server Response URL got a time out")
render :text => 'Server got a time out', :status => 401
elsif response.code == 0
# Could not get an http response, something's wrong
log_action("#{response.curl_error_message}", :warn)
render :text => response.curl_error_message, :status => 401
else
# Received a non-successful htpp response.
log_action("HTTP request failed: #{response.code.to_s}", :warn)
render :text => response.code.to_s, :status => 401
end
end
hydra.queue(request)
hydra.run
end[/code]
Ale wyrzuca mi blad:
NoMethodError: undefined method `request=' for nil:NilClass
test/functional/serialowy_controller_test.rb:38:in `make_request'
app/controllers/serialowy_controller.rb:34:in `ipsos'
test/functional/serialowy_controller_test.rb:52:in `block (2 levels) in <class:SerialowyControllerTest>'
Jesli chodzi o ta linijke to jest to zupelnie bezsensowne to co zrobilem.
Ten kod jest mega-podejrzany. Po co używasz Typhoeus i kolejkujesz requesty w kolejce, jeśli robisz tylko jeden request i tak? Po co korzystać z hydry w tym wypadku?
Poza tym, jakbyś sobie zrefaktorował kod, że Hydra byłaby widoczna poza metodą make_request, to mógłbyś sobie wygodnie stubować requesty prostym:
[code]rails g model --help
Usage:
rails generate model NAME [field:type field:type] [options]
Options:
-o, --orm=NAME # Orm to be invoked
Runtime options:
-f, [–force] # Overwrite files that already exist
-p, [–pretend] # Run but do not make any changes
-q, [–quiet] # Supress status output
-s, [–skip] # Skip files that already exist
Description:
Create rails files for model generator.[/code]
To też jest opcja Fajnie, że sam znalazłeś ale tak na przyszłość to rails nie robi tutaj żadnej magii. Po prostu tworzysz plik i masz model. Jeśli chcesz model bez migracji (czyli pewnie też bez bazy) to nie dziedziczysz z AR::Base i tyle.