to są moje pierwsze kroczki w railsach. Stworzyłem bloga wg tutka stąd http://rubyonrails.pl/screencasty. Chciałem teraz napisać testy. Więc napisałem:
[code]require ‘test_helper’
class PostsControllerTest < ActionController::TestCase
test “should create post” do
post :new, :title => ‘Tytuł postu’, :body => ‘jakaś tam treść’
p = Post.first
assert_equal ‘Tytuł postu’, p.title
assert_redirected_to post_url§
end
end[/code]
lecz dostaję błąd w linii 7 dostaję w p.title ciągle nil…
wyłączyłem na chwilę autoryzację, aby 401 nie rzucało
logowanie możesz zrobić, tak, że zrobić stuba dla metody authenticate! (jeśli używasz devisa) i zwrócisz true po wywoałniu, ale to nie jest sprawdzenie czy osoba jest zalogowana a jedynie symulacja.
czy post :new w twojej aplikacji tworzy nowy rekord w bazie? Może chcesz raczej testować post :create, w tym przypadku?
czy na pewno Post.first pobiera z bazy to co chesz? Może lepsze będzie Post.last, albo sprawdzenie Post.count przed i po teście oraz sprawdzenie assigns?
Pytasz się jak zasymulować logowanie, a nie pokazujesz jak wygląda mechanizm logowania. Zarzuć jakimś kodem, bo w przeciwnym razie cieżko będzie zgadnąć.
def authenticate do [name, password]
authenticate_or_request_http_basic do [name, password]
name = 'admin' && password = 'secret'
end
end @tiwi
no tworzenie nowego posta
@kabanek
Zauważ subtelną różnicę w Twojej linijce kodu i tej zaproponowanej przeze mnie Jeśli w formularzu używasz form_for i masz model Post, to paramsy domyślnie będą przekazywane w ten sposób
#EDITED:
Aaaa, też głupoty piszę, sory. Obstawiam, że to powinno wyglądać mniej więcej tak:
post :create, :post => {:title => 'Tytuł postu', :body => 'jakaś tam treść'}
Z tego względu, że dane z formularza lecą do metody create, a nie new
[quote=kabanek]def authenticate do [name, password]
authenticate_or_request_http_basic do [name, password]
name = 'admin' && password = 'secret'
end
end @tiwi
no tworzenie nowego posta :)[/quote]
jesteś na 100% pewien, że tak wygląda ten kawałek kodu?
def authenticate
authenticate_or_request_http_basic do |name, password|
name == 'admin && password == 'secret'
end
end
nawiasy kwadratowe oznaczają tablice a nie parametry przekazywane do bloku. te oznacza się przez tą (|) pionową kreskę która nie wiem jak się nazywa
class PostsControllerTest < ActionController::TestCase
test “should create post” do
post :create, :post => {:title => ‘Tytuł postu’, :body => ‘jakaś tam treść’}
p = Post.last
assert_equal ‘Tytuł postu’, p.title
assert_redirected_to post_url§
end
end[/code]
i nadal mam
[quote]test_should_create_post(PostsControllerTest) [test/functional/posts_controller_test.rb:7]:
<“Tytuł postu”> expected but was
.[/quote]
czyli jednak do bazy nie zapisuje nadal
@up
to nie był kopiowany kod a przepisywany sory za wprowadzenie w błąd. Mój kod wygląda tak:
private
def authenticate
authenticate_or_request_with_http_basic do |name, password|
name = "admin" && password = "secret"
end
end
assert_redirected_to post_url(p)
assert_equal 'Tytuł postu', p.title
wykonując Twój kod dostałem 401 Unauthorized, więc tak na prawdę nawet nie uderzyło w akcję #create (wymagany jest przecież HTTP Basic), a Post.last zwrociło to co akurat było w bazie danej testowej; mi ostatni fixture.
class PostsControllerTest < ActionController::TestCase
test “should create post” do
post :create, :post => {:title => ‘Tytuł postu’, :body => ‘jakaś tam treść’}
p = Post.last
assert_redirected_to post_url§
assert_equal ‘Tytuł postu’, p.title
end
end[/code]
i wykomentowałem linijkę
[quote]1) Failure:
test_should_create_post(PostsControllerTest) [test/functional/posts_controller_test.rb:8]:
<“Tytuł postu”> expected but was
.[/quote]
kurcze nie wiem co jest nie tak;P a pomysły mi się już kończa
niby zaczęło działać, tylko wywalało mi błąd, że metoda slug jest nieznana
test "create slug based on title" do
post = Post.new
post.body = 'some body'
post.title = 'My title'
post.createSlug
assert_equal 'My-title', post.slug
end
w przed ostatniej linijce.
zmieniłem za to klasę post