Problem z testami

To są moje pierwsze testy no i oczywiście jak robi się coś pierwszy raz to zawsze wyskakują błędy.

Wg tutoriala do railsów 3 zainstalowałem RSpec, testowałem kontroler languages który odpowiada za zmianami języków strony. Po wpisaniu

rspec spec/controllers/languages_controller_spec.rb

Otrzymałem:

1) LanguagesController GET 'index' should be successful Failure/Error: get 'index' PGError: ERROR: relation "languages" does not exist LINE 1: SELECT "languages".* FROM "languages" WHERE (activate = true... ^ : SELECT "languages".* FROM "languages" WHERE (activate = true and abbr != 'pl') ORDER BY name # ./app/controllers/application_controller.rb:12:in `set_locale' # ./spec/controllers/languages_controller_spec.rb:7:in `block (3 levels) in <top (required)>'
Wyniki są identyczne dla każdej akcji

A teraz wyjaśnienia, w application_controller.rb:12 mam wpisany taki kod:

@languages = Language.find :all, :conditions => ['activate = true and abbr != ?', locale], :order => "name"

A languages_controller_spec.rb

05. describe "GET 'index'" do 06. it "should be successful" do 07. get 'index' 08. response.should be_success 09. end 10. end
Akcja w kontrolerze wygląda natomiast tak:

@lang = Language.find :all, :order => 'name'

EDIT
błąd bazy danych wynikał z jej braku. Utworzyłem ją i teraz mam błąd:

1) LanguagesController GET 'index' should be successful Failure/Error: response.should be_success expected success? to return true, got false # ./spec/controllers/languages_controller_spec.rb:8:in `block (3 levels) in <top (required)>'

Generalnie jest to dla mnie bardzo poważna wada RSpeca że mówi ci tylko że błąd istnieje, i niewiele o tym co jest jego powodem, albo gdzie dokładnie występuje.

Sprawdź czy masz widok, możesz spróbować otworzyć stronę w przeglądarce i zobaczyć co się dzieje. Sprawdź m.in. czy nie masz gdzieś before filtrów (typu autentykacja), lubią się wypieprzać w testach po cichu.

relation “languages” does not exist

Co jeszcze można powiedzieć na ten temat. Nie ma tabeli w bazie. Jak byk napisane.

paneq: Jabyś czytał ze zrozumieniem całego posta to byś zauważył m.in.

[quote]EDIT
błąd bazy danych wynikał z jej braku. Utworzyłem ją i teraz mam błąd:
Kod:

  1. LanguagesController GET ‘index’ should be successful
    Failure/Error: response.should be_success
    expected success? to return true, got false

    ./spec/controllers/languages_controller_spec.rb:8:in `block (3 levels) in <top (required)>’

Ostatnio edytowany przez wafcio (Dzisiaj 00:19:58)[/quote]
Więc generalnie pierwszy błąd został naprawiony, a z drugiego raczej niewiele wynika.

Wynika bardzo dużo :wink:

response.should be_success -> expected success? to return true, got false

response.success? => false

def success? (200..299).include?(code) end
To nie wina rspeca że ci nie mówi co jest źle. Mówi tyle ile trzeba.

RSpec testuje to, o co go poprosisz.

describe "GET 'index'" do it "should be successful" do get 'index' response.should be_success end end
Ten kod sprawdza tylko czy kod odpowiedzi to 200 - i to wystarcza do test suite. Podczas diagnozowania błędu warto dodać dodatkowe sprawdzenia, np. żeby się przekonać czy nie nastąpił redirect

response.should_not be_redirect response.should be_success
Popatrz też w logi (logs/test.log) i zobacz co tam się dzieje.

Jak dla mnie g. z tego wynika, albowiem nie mówi ci PRZYCZYNY dla której akcja się nie powiodła.

No jak dla mnie to właśnie jest wina rspeca że nie mówi co jest źle! A jak dla mnie nie mówi ile trzeba bo nie mówi ci jak naprawić błąd, ani gdzie występuje, tylko że istnieje po prostu.

Kwestja preferencji podejrzewam, ja wolę już po przejechaniu testów widzieć gdzie mam błąd niż uruchamiać testy, patrzeć jak się pierdolną, dodawać debbugera w 20 miejscach i 10 dodatkowych asercji żeby się dowiedzieć czy przypadkiem nie dostałem redirecta bo zapomniałem zastubować autentykację.

o wiele bardziej mi pasuje taki na przykąłd komunikat:

I odrazu wiesz o co bangla.

Jak dla mnie g. z tego wynika, albowiem nie mówi ci PRZYCZYNY dla której akcja się nie powiodła.

No jak dla mnie to właśnie jest wina rspeca że nie mówi co jest źle! A jak dla mnie nie mówi ile trzeba bo nie mówi ci jak naprawić błąd, ani gdzie występuje, tylko że istnieje po prostu.

Kwestja preferencji podejrzewam, ja wolę już po przejechaniu testów widzieć gdzie mam błąd niż uruchamiać testy, patrzeć jak się pierdolną, dodawać debbugera w 20 miejscach i 10 dodatkowych asercji żeby się dowiedzieć czy przypadkiem nie dostałem redirecta bo zapomniałem zastubować autentykację.

o wiele bardziej mi pasuje taki na przykąłd komunikat:

I odrazu wiesz o co bangla.[/quote]
No to zaimplementuj Response Code Matcher

http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

Tylko IMHO to potrzebne Ci jak drzwi w lesie.

A pozatym testjesz success____?____, to chyba jasne że będzie true albo false. Dalej trolować mi się już nie chce.

Jakby Rspec mówił, jak naprawić błąd to by programista nie był potrzebny

Jednak chyba jestem za assemblerem na uczelniach ;]

dzięki za odpowiedzi, już mniej więcej wiem o co chodzi.

Powróciłem do pisania testów aplikacji, ale pojawił się problem innego rodzaju.

Mam ten kontroler LanguagesController, który ma kilka akcji, ma standardowe akcje dla resources i dodane do tego dodatkowe trzy akcje. Akcja ‘index’ wyświetla oczywiście listę dostępnych języków. Jak chciałem napisać do tego testy to wpisałem tak:

require 'spec_helper' describe LanguagesController do describe "GET 'index'" do it "should be successful" do get 'index' response.should be_success end end end
Ale po uruchomieniu polecenia

rspec ./spec/controllers/languages_controller_spec.rb

To wyskakują mi następujące błędy:

<internal:lib/rubygems/custom_require>:29:in `require': no such file to load -- spec_helper (LoadError) from <internal:lib/rubygems/custom_require>:29:in `require' from /home/wafcio/rails_projects/spg/spec/controllers/languages_controller_spec.rb:1:in `<top (required)>' from /home/wafcio/.rvm/gems/ruby-1.9.2-p136@rails3/gems/rspec-core-2.0.1/lib/rspec/core/configuration.rb:306:in `load' from /home/wafcio/.rvm/gems/ruby-1.9.2-p136@rails3/gems/rspec-core-2.0.1/lib/rspec/core/configuration.rb:306:in `block in load_spec_files' from /home/wafcio/.rvm/gems/ruby-1.9.2-p136@rails3/gems/rspec-core-2.0.1/lib/rspec/core/configuration.rb:306:in `map' from /home/wafcio/.rvm/gems/ruby-1.9.2-p136@rails3/gems/rspec-core-2.0.1/lib/rspec/core/configuration.rb:306:in `load_spec_files' from /home/wafcio/.rvm/gems/ruby-1.9.2-p136@rails3/gems/rspec-core-2.0.1/lib/rspec/core/command_line.rb:18:in `run' from /home/wafcio/.rvm/gems/ruby-1.9.2-p136@rails3/gems/rspec-core-2.0.1/lib/rspec/core/runner.rb:55:in `run_in_process' from /home/wafcio/.rvm/gems/ruby-1.9.2-p136@rails3/gems/rspec-core-2.0.1/lib/rspec/core/runner.rb:46:in `run' from /home/wafcio/.rvm/gems/ruby-1.9.2-p136@rails3/gems/rspec-core-2.0.1/lib/rspec/core/runner.rb:10:in `block in autorun'