Testy funkcjonalne - error w testach, widoki działają (Test::Unit)

Bry wieczór. :slight_smile:

Po milionie lat lenistwa (“prokrastynacji”) znowu się wziąłem za Railsy (prawie od zera) i na dobry początek zjada mnie problem.
Mam 2 modele (courses i languages), w skrócie:
language:

has_many :courses

courses:

belongs_to :language

Courses mają (m.in) pole language_id.

Przy wyświetlaniu kursu nie ma żadnego problemu. W widoku (courses/views/show.html.erb) jest:

<%= @course.language.name %>

i bez problemu pokazuje to, czego bym oczekiwał, czyli nazwę języka.

Za to testy funkcjonalne dla courses (generowane scaffoldem, Test::Unit), które wyglądają tak:

... setup do @course = courses(:one) end ... test "should show course" do get :show, id: @course.to_param assert_response :success end
(w fixturach dla :one wartość language_id = 1)

wywalają błąd:

test_should_show_course ERROR undefined method `name' for nil:NilClass STDERR: Exception `ActionView::Template::Error' at /home/jaqbeu/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/activesupport-3.1.3/lib/active_support/whiny_nil.rb:48:in `method_missing'
Ten sam błąd pojawia się dla “should get index” (gdzie w widoku jest to samo, co w show); pozostałe testy funkcjonalne przechodzą (jednostkowe też).

Po rozpisaniu się uświadomiłem sobie, że pewnie powinienem w setup() stworzyć jakoś język, żeby w ogóle istniał i mógł mieć jakieś name, ale no właśnie: jak?
Próbowałem:

language = Language.create(id:1, name:"Ruby") @language = Language.create(id:1, name:"Ruby") Language.create(id:1, name:"Ruby")
(wszystko wewnątrz setup(), nie naraz ;)) ale cały czas błądzi…
Przychodzą mi do głowy jeszcze fixtury, ale też nie wiem, jak można tam coś dodać do relacji (i nawet za bardzo nie mam pomysłu, jak tego szukać :|).

Co robić, jak żyć?

Rails 3.1.3, ruby 1.9.3p0 (2011-10-30 revision 33570) na rbenv (jak widać ;)). Jeżeli pytanie zasysa, to I blame późną porę i kajam się.

Jeżeli dobrze rozumiem to Twoje fixtury powinny wyglądać mniej więcej tak:

languages.yml

eng: name: "English"
courses.yml

one: language: eng
Sprawdź również czy działa jeśli nie ustawisz na sztywno ID języka.

Kiedy korzystasz z fixtur to zdefiniowane elementy będą już stworzone w bazie danych.

Pozdrawiam

Cytując poezję świeżo postawionego nginxa: It works!

A dokładniej działa dodanie wspomnianego

language: eng

(czy tam cokolwiek, co w końcu będzie językiem i istnieje w fixturach dla language).

Ustawienie “na sztywno” language_id powodowało właśnie ten błąd. Nie wiedziałem, że można takie rzeczy w fixturach robić. :slight_smile:

Dzięki. :slight_smile: