Testownie logowania rspec

Witam, mam problem podczas testowania logowania, dodam, że w przeglądarce wszystko jest ok.

SessionsController:

class SessionsController < ApplicationController def new end def create user = User.find_by_name(params[:session][:name].downcase) if user && user.authenticate(params[:session][:password]) sign_in user flash[:success] = 'Zalogowano' redirect_to user else flash.now[:error] = 'Niepoprawna nazwa lub haslo' render 'new' end end def destroy sign_out redirect_to root_url end end
widok new kontrolera sesji

[code]<% provide( :title, ‘Logowanie’) %>

Logowanie

<%= form_for(:session, url: sessions_path) do |f| %>
	<%= f.label :name, "Nazwa Użytkownika" %>
	<%= f.text_field :name %>

	<%= f.label :password, "Hasło" %>
	<%= f.password_field :password %>

  <%= f.submit "Loguj", class: "btn btn-large btn-primary" %>
<% end %>
</div>
[/code] fragment testów: [code]describe "with valid informaton" do let(:user) { FactoryGirl.create(:user) } before do visit signin_path fill_in "Naz", with: user.name fill_in "Has", with: user.password click_button "Loguj" end
it { should have_selector('div.alert.alert-success', text: 'Zalogowano')}
it { should_not have_selector('div.alert.alert-error', text: 'Niepoprawna')}
it { should have_selector('title', text: user.name) }
it { should have_link('Profil'), href: user_path(user) }
it { should have_link('Wyloguj', href: signout_path) }
  	it { should_not have_link('Zaloguj', href: signin_path) }
it { should_not have_selector('title', text: 'Logowanie') }

 	describe "followed by signout" do 
  		before { click_link "Wyloguj"}
  		it { should have_link('Zaloguj')}
  	end

end[/code]
factories.rb:

FactoryGirl.define do factory :user do name "Mateusz" email "Mat@example.com" password "foobar" password_confirmation "foobar" end end
błędy:

[code]Failures:

  1. Autentyfikacjas signin with valid informaton
    ←[31mFailure/Error:←[0m ←[31mit { should have_selector(‘div.alert.alert-suc
    cess’, text: ‘Zalogowano’)}←[0m
    ←[31mexpected css “div.alert.alert-success” with text “Zalogowano” to ret
    urn something←[0m
    ←[36m # c:/Users/Mateusz/work/sklep/spec/requests/autentyfikacjas_spec.rb:29
    :in `block (4 levels) in <top (required)>'←[0m

  2. Autentyfikacjas signin with valid informaton
    ←[31mFailure/Error:←[0m ←[31mit { should have_selector(‘title’, text: user.
    name) }←[0m
    ←[31mexpected css “title” with text “Mateusz” to return something←[0m
    ←[36m # c:/Users/Mateusz/work/sklep/spec/requests/autentyfikacjas_spec.rb:31
    :in `block (4 levels) in <top (required)>'←[0m

  3. Autentyfikacjas signin with valid informaton
    ←[31mFailure/Error:←[0m ←[31mit { should_not have_link(‘Zaloguj’, href: sig
    nin_path) }←[0m
    ←[31mexpected link “Zaloguj” not to return anything←[0m
    ←[36m # c:/Users/Mateusz/work/sklep/spec/requests/autentyfikacjas_spec.rb:34
    :in `block (4 levels) in <top (required)>'←[0m

  4. Autentyfikacjas signin with valid informaton
    ←[31mFailure/Error:←[0m ←[31mit { should have_link(‘Profil’), href: user_pa
    th(user) }←[0m
    ←[31m{:href=>"/users/1"}←[0m
    ←[36m # c:/Users/Mateusz/work/sklep/spec/requests/autentyfikacjas_spec.rb:32
    :in `block (4 levels) in <top (required)>'←[0m

  5. Autentyfikacjas signin with valid informaton
    ←[31mFailure/Error:←[0m ←[31mit { should have_link(‘Wyloguj’, href: signout
    _path) }←[0m
    ←[31mexpected link “Wyloguj” to return something←[0m
    ←[36m # c:/Users/Mateusz/work/sklep/spec/requests/autentyfikacjas_spec.rb:33
    :in `block (4 levels) in <top (required)>'←[0m

  6. Autentyfikacjas signin with valid informaton
    ←[31mFailure/Error:←[0m ←[31mit { should_not have_selector(‘title’, text: ’
    Logowanie’) }←[0m
    ←[31mexpected css “title” with text “Logowanie” not to return anything←[0
    m
    ←[36m # c:/Users/Mateusz/work/sklep/spec/requests/autentyfikacjas_spec.rb:36
    :in `block (4 levels) in <top (required)>'←[0m

  7. Autentyfikacjas signin with valid informaton
    ←[31mFailure/Error:←[0m ←[31mit { should_not have_selector(‘div.alert.alert
    -error’, text: ‘Niepoprawna’)}←[0m
    ←[31mexpected css “div.alert.alert-error” with text “Niepoprawna” not to
    return anything←[0m
    ←[36m # c:/Users/Mateusz/work/sklep/spec/requests/autentyfikacjas_spec.rb:30
    :in `block (4 levels) in <top (required)>'←[0m

  8. Autentyfikacjas signin with valid informaton followed by signout
    ←[31mFailure/Error:←[0m ←[31mbefore { click_link “Wyloguj”}←[0m
    ←[31mCapybara::ElementNotFound:←[0m
    ←[31mno link with title, id or text ‘Wyloguj’ found←[0m
    ←[36m # (eval):2:in click_link'←[0m ←[36m # c:/Users/Mateusz/work/sklep/spec/requests/autentyfikacjas_spec.rb:39 :inblock (5 levels) in <top (required)>'←[0m[/code]

Nie wiadomo co jest subjectem w twoich testach. Zamień should na page.should.

oto cały kod testów, znajduje się tam wpis subject {page}

[code] require ‘spec_helper’

describe “Autentyfikacjas” do
subject {page}

describe “signin page” do
before {visit signin_path}
it { should have_selector( ‘h1’, text:‘Logowanie’ )}
end
describe “signin” do
before {visit signin_path }

	describe "with invalid informaton" do
		before {click_button "Loguj"}

		it { should have_selector('title', text: "Logowanie")}
		it { should have_selector('div.alert.alert-error', text: 'Niepoprawna')}
	end
	
	describe "with valid informaton" do
		let(:user) { FactoryGirl.create(:user) }
		before do
			visit signin_path
			fill_in "Naz",    with: user.name
			fill_in "Has", with: user.password
			click_button "Loguj"
		end
			
		it { should have_selector('div.alert.alert-success', text: 'Zalogowano')}
		it { should_not have_selector('div.alert.alert-error', text: 'Niepoprawna')}
		it { should have_selector('title', text: user.name) }
		it { should have_link('Profil'), href: user_path(user) }
		it { should have_link('Wyloguj', href: signout_path) }
  		it { should_not have_link('Zaloguj', href: signin_path) }

		it { should_not have_selector('title', text: 'Logowanie') }

  		describe "followed by signout" do 
  			before { click_link "Wyloguj"}
  			it { should have_link('Zaloguj')}
  		end
	end
end

end[/code]
dopisałem też page.should, ale dalej są błędy.

Te same błędy?
Spróbuj dopisaćjeden test z zawartością page.should have_content(‘cokolwiek’) i pokaż jego wynik. Powinien wypisać zawartość aktualnej strony.

oto wynik testu it { page.should have_content(‘cokolwiek’)}:

8) Autentyfikacjas signin with valid informaton ←[31mFailure/Error:←[0m ←[31mit { page.should have_content('cokolwiek')}←[0 m ←[31mexpected there to be content "cokolwiek" in "Sklep | Logowanie\n \n \n Sklep\n Home\n Pomoc\n Zaloguj się\n Zarejestruj się\n \n \nNiepoprawna nazwa lub haslo\n \n \ nLogowanie\n\n\n\t\n\t\t\n\n\t\tNazwa Użytkownika\n\t\tHasło\n\t\t\n\n\n\t\n\n\n \n \n \n \n \n \n Copyright by wilqq, version:\n 0. 1 Beta\n \n "←[0m ←[36m # c:/Users/Mateusz/work/sklep/spec/requests/autentyfikacjas_spec.rb:37 :in `block (4 levels) in <top (required)>'←[0m

A fabryka na pewno tworzy poprawnego usera? Zapisuje się do bazy danych?
Spróbuj użyć w którymś z failujących testów funkcji save_and_open_page, żeby zobaczyć co właściwie renderuje ci na tej stronie.

EDIT:
Z innych pomysłów: zrób rake db:test:prepare i zamień before na before(:each)

Przerobiłem trochę testy

[code]require ‘spec_helper’

describe “Autentyfikacjas” do
subject {page}

describe “signin page” do
before {visit signin_path}
it { should have_selector( ‘h1’, text:‘Logowanie’ )}
end
describe “signin” do
before {visit signin_path }

	describe "with invalid informaton" do
		before {click_button "Loguj"}

		it { should have_selector('title', text: "Logowanie")}
		it { should have_selector('div.alert.alert-error', text: 'Niepoprawna')}
	end
	
	describe "with valid informaton" do
		let(:user) { FactoryGirl.create(:user) }
		before do
			visit signup_path
			fill_in "Nazwa",		 with: "Mateusz"
			fill_in "Email", 	 with: "Mateusz@m.pl"
			fill_in "Has",  with: "Mmmmmm"
			fill_in "Potwierd", with: "Mmmmmm"
			click_button "Zarejestruj"

			visit signin_path
			fill_in "Name",    with: "Mateusz"
			fill_in "Password", with: "Mmmmmm"
			click_button "Loguj"
		end
			
		it {save_and_open_page; should have_selector('div.alert.alert-success', text: 'Zalogowano')}
		it { should_not have_selector('div.alert.alert-error', text: 'Niepoprawna')}
		it { should have_selector('title', text: "Mateusz") }
		it { should have_link('Wyloguj', href: signout_path) }
  		it { should_not have_link('Zaloguj', href: signin_path) }

		it { should_not have_selector('title', text: 'Logowanie') }
		it { page.should have_content('cokolwiek')}

  		describe "followed by signout" do 
  			before { click_link "Wyloguj"}
  			it { should have_link('Zaloguj')}
  		end
	end
end

end[/code]
oto błędy:

[code]Failures:

  1. Autentyfikacjas signin with valid informaton
    ←[31mFailure/Error:←[0m ←[31mit { should have_selector(‘title’, text: “Mate
    usz”) }←[0m
    ←[31mexpected css “title” with text “Mateusz” to return something←[0m
    ←[36m # c:/Users/Mateusz/work/sklep/spec/requests/autentyfikacjas_spec.rb:38
    :in `block (4 levels) in <top (required)>'←[0m

  2. Autentyfikacjas signin with valid informaton
    ←[31mFailure/Error:←[0m ←[31mit { page.should have_content(‘cokolwiek’)}←[0
    m
    ←[31mexpected there to be content “cokolwiek” in "Sklep | Logowanie\n
    \n \n Sklep\n Home\n Pomoc\n \n \n
    Profil \n \n Mój Profil\n
    Ustawienia\n \n \n Wyloguj\n
    \n \n \n \nNiepoprawna nazwa lub haslo\n
    n \nLogowanie\n\n\n\t\n\t\t\n\n\t\tName\n\t\tPassword\n\t\t\n\n\n\t\n\n\n\n
    \n \n \n \n \n Copyright by wilqq, version:\n 0.1
    Beta\n \n "←[0m
    ←[36m # c:/Users/Mateusz/work/sklep/spec/requests/autentyfikacjas_spec.rb:43
    :in `block (4 levels) in <top (required)>'←[0m

  3. Autentyfikacjas signin with valid informaton
    ←[31mFailure/Error:←[0m ←[31mit {save_and_open_page; should have_selector(’
    div.alert.alert-success’, text: ‘Zalogowano’)}←[0m
    ←[31mexpected css “div.alert.alert-success” with text “Zalogowano” to ret
    urn something←[0m
    ←[36m # c:/Users/Mateusz/work/sklep/spec/requests/autentyfikacjas_spec.rb:36
    :in `block (4 levels) in <top (required)>'←[0m

  4. Autentyfikacjas signin with valid informaton
    ←[31mFailure/Error:←[0m ←[31mit { should_not have_selector(‘title’, text: ’
    Logowanie’) }←[0m
    ←[31mexpected css “title” with text “Logowanie” not to return anything←[0
    m
    ←[36m # c:/Users/Mateusz/work/sklep/spec/requests/autentyfikacjas_spec.rb:42
    :in `block (4 levels) in <top (required)>'←[0m

  5. Autentyfikacjas signin with valid informaton
    ←[31mFailure/Error:←[0m ←[31mit { should_not have_selector(‘div.alert.alert
    -error’, text: ‘Niepoprawna’)}←[0m
    ←[31mexpected css “div.alert.alert-error” with text “Niepoprawna” not to
    return anything←[0m
    ←[36m # c:/Users/Mateusz/work/sklep/spec/requests/autentyfikacjas_spec.rb:37
    :in `block (4 levels) in <top (required)>'←[0m[/code]
    Wydaje się, że użytkownik został zalogowany, nie ma linku do logowania, jest do wylogowania się, ale jednak jest komunikat o niepoprawnym zalogowaniu. Nie wiem też, czy dobrze użyłem opcji save_and_open_page, dodanie tego nie powoduje żadnej akcji.

zamień before na before(:each)

Błędy są raczej takie same:

[code]Failures:

  1. Autentyfikacjas signin with valid informaton
    ←[31mFailure/Error:←[0m ←[31mit { should_not have_selector(‘div.alert.alert
    -error’, text: ‘Niepoprawna’)}←[0m
    ←[31mexpected css “div.alert.alert-error” with text “Niepoprawna” not to
    return anything←[0m
    ←[36m # c:/Users/Mateusz/work/sklep/spec/requests/autentyfikacjas_spec.rb:37
    :in `block (4 levels) in <top (required)>'←[0m

  2. Autentyfikacjas signin with valid informaton
    ←[31mFailure/Error:←[0m ←[31mit {save_and_open_page should have_selector(‘d
    iv.alert.alert-success’, text: ‘Zalogowano’)}←[0m
    ←[31mexpected css “div.alert.alert-success” with text “Zalogowano” to ret
    urn something←[0m
    ←[36m # c:/Users/Mateusz/work/sklep/spec/requests/autentyfikacjas_spec.rb:36
    :in `block (4 levels) in <top (required)>'←[0m

  3. Autentyfikacjas signin with valid informaton
    ←[31mFailure/Error:←[0m ←[31mit { should_not have_selector(‘title’, text: ’
    Logowanie’) }←[0m
    ←[31mexpected css “title” with text “Logowanie” not to return anything←[0
    m
    ←[36m # c:/Users/Mateusz/work/sklep/spec/requests/autentyfikacjas_spec.rb:42
    :in `block (4 levels) in <top (required)>'←[0m

  4. Autentyfikacjas signin with valid informaton
    ←[31mFailure/Error:←[0m ←[31mit { page.should have_content(‘cokolwiek’)}←[0
    m
    ←[31mexpected there to be content “cokolwiek” in "Sklep | Logowanie\n
    \n \n Sklep\n Home\n Pomoc\n \n \n
    Profil \n \n Mój Profil\n
    Ustawienia\n \n \n Wyloguj\n
    \n \n \n \nNiepoprawna nazwa lub haslo\n
    n \nLogowanie\n\n\n\t\n\t\t\n\n\t\tName\n\t\tPassword\n\t\t\n\n\n\t\n\n\n\n
    \n \n \n \n \n Copyright by wilqq, version:\n 0.1
    Beta\n \n "←[0m
    ←[36m # c:/Users/Mateusz/work/sklep/spec/requests/autentyfikacjas_spec.rb:43
    :in `block (4 levels) in <top (required)>'←[0m

  5. Autentyfikacjas signin with valid informaton
    ←[31mFailure/Error:←[0m ←[31mit { should have_selector(‘title’, text: “Mate
    usz”) }←[0m
    ←[31mexpected css “title” with text “Mateusz” to return something←[0m
    ←[36m # c:/Users/Mateusz/work/sklep/spec/requests/autentyfikacjas_spec.rb:38
    :in `block (4 levels) in <top (required)>'←[0m[/code]