2012-03-13 3 views
2

난 당신이 로그인 사용자의 이메일과 비밀번호를 사용하는 카피 바라의 간단한 로그인 예제 테스트를 만들기 위해 노력하고있어, 그것은 어떤 이유로 카피 바라를 들어카피 바라 현재 경로

"로그인"통지와 함께 root_url 리디렉션 내가 login_path "/ login"에서 click_on 로그인을 사용했다고보고하지만 레일을 실행할 때 나는 root_path "/"에 있습니다.

카피 바라 또는 테스트 응용 프로그램에서 무엇을 놓쳤습니까? 모든 관련 코드가 아래에 있어야합니다.

컨트롤러/sessions_controller.rb

def create 
    user = User.find_by_email(params[:email]) 
    if user && user.authenticate(params[:password]) 
     session[:user_id] = user.id 
     redirect_to root_url, notice: "logged in" 
    else 
     redirect_to login_path, notice: "Email or password incorrect" 
    end 
    end 

보기/세션/new.html.erb

<h1>Sessions Log In</h1> 
<%= form_tag sessions_path do %> 
    <div class="field"> 
    <%= label_tag :email %><br /> 
    <%= text_field_tag :email, params[:email] %> 
    </div> 
    <div class="field"> 
    <%= label_tag :password %><br /> 
    <%= password_field_tag :password %> 
    </div> 
    <div class="actions"><%= submit_tag "log in" %> </div> 
<% end %> 

login_spec.rb

it "should let you login with correct password" do 
    user = Factory.build(:user) 
    visit login_path 
    fill_in "Email", :with => user.email 
    fill_in "Password", :with => user.password 
    click_on "log in" 
    current_path.should == root_path 
    page.should have_content("logged in") 
end 

routes.rb

... 
    get 'login', to: 'sessions#new', as: 'login' 
... 

Factories.rb

Factory.define :user do |f| 
    f.sequence(:email) {|n| "a#{}@a.a"} 
    f.password "a" 
end 
+1

실제로 로그인했는지 확인할 수 있습니까? 현재 경로를 선언하기 전에'page.should have_content ("logged in")를 배치 해보십시오. 왜 사용자를 생성하거나 저장하는 대신 사용자 만 구성하는 것입니까? Factory.build (: user)'가 Factory (: user)와 다른 기능을하고 실제로는 사용자를 저장하지 않는다는 것을 알기를 바랍니다. – prasvin

+0

정확하게 맞았습니다. 나는 건축 대신에 창조하려고했다. 답변으로 넣어주세요. 제발 틱 할 수 있습니다. – BookOfGreg

답변

1

당신은 당신이 실제로 로그인되어 있는지 확인 할 수 있나요?

current_path을 주장하기 전에 page.should have_content("logged in")을 배치 해보십시오.

왜 사용자를 생성하거나 저장하는 대신 사용자 만 구성하는 것입니까? Factory.build(:user) 기능이 Factory(:user)과 다른 것으로 알고 실제로 사용자를 저장하지 않기를 바랍니다.

+0

이 답변이 작동하는 이유는'have_content'가 페이지에 내용이 나타날 때까지 대기하는 반면'current_path'는 총을 건너 뛰는 것 같습니다. –

+0

이것은 오래된 스레드이지만 최초의 Google 히트작이었습니다. 나중에 참조 할 경우 Capybara에도 have_current_path 스마트 매처가 있음을 알아 두십시오. [카피 바라] (http://www.rubydoc.info/github/jnicklas/capybara/master/Capybara/RSpecMatchers#have_current_path-instance_method) – Axe

관련 문제