2017-10-17 12 views
1

Docker를 사용하는 매우 기본적인 Rails 5 애플리케이션입니다. 여기에는 Devise 등을 사용하지 않고 처음부터 빌드 한 일부 사용자 인증이 포함되어 있습니다. 이제, 카피 바라와 함께 요청 사양에 대해 배우기 시작하고 싶지만, 나는 꽤 이상한 문제 인 것처럼 보입니다.Capybara에서 POST 할 때 GET 요청

여기 내 로그인 폼 (sessions.new.erb)입니다 :

<%= form_tag sessions_path do %> 
      <form class="m-t" role="form" action="/"> 
       <div class="form-group"> 
       <%= text_field_tag :email, params[:email], class: 'form-control', placeholder: "Email Address", required: "" %> 
       </div> 
       <div class="form-group"> 
       <%= password_field_tag(:password, nil, class: 'form-control', placeholder: "Password", required: "") %> 
       </div> 
       <div class="form-group"> 
         <%= check_box_tag :remember_me, 1, params[:remember_me] %> 
         <%= label_tag :remember_me %> 
         </div> 
       <div class="actions"><%= submit_tag "Log In", class: "btn btn-primary block full-width m-b" %></div> 
      </form> 
     <% end %> 

그리고 내 requests/sessions_spec.rb : 당신은 내가 같은 일을 볼 것 카피 바라를 추정 할 수동으로 테스트하는 경우

require "rails_helper" 

RSpec.feature "Login", :type => :feature do 
    scenario "handles wrong email and password gracefully" do 
    visit login_path 
    fill_in "Email Address", :with => "something" 
    fill_in "Password", :with => "something" 
    click_button "Log In" 

    expect(page).to have_text("Email or password incorrect") 
    end 
end 

지금이 작동합니다. 그러나 그것은 계속 실패했다. 보호 된 컨트롤러에 액세스하려고 시도했지만 로그인하지 않은 경우 응용 프로그램이 구성되어있어 /login으로 리디렉션되고 Please log in to see this page이라는 메시지가 깜박입니다. Rspec 테스트는 이상한 것이 었습니다. Capybara가 다른 페이지를 방문하려고 시도했음을 암시합니다. 첫 번째 비트, 로그인 새로 만들기 SessionsController 번호로 괜찮 처리 GET됩니다

Started GET "/login" for 127.0.0.1 at 2017-10-17 06:59:26 +0000 
Processing by SessionsController#new as HTML 
    Rendering sessions/new.html.erb within layouts/empty 
    Rendered sessions/new.html.erb within layouts/empty (1.1ms) 
Completed 200 OK in 6ms (Views: 6.1ms | ActiveRecord: 0.0ms) 
Started GET "/?email=something&password=[FILTERED]&commit=Log+In" for 127.0.0.1 at 2017-10-17 06:59:26 +0000 
Started GET "/locations" for 127.0.0.1 at 2017-10-17 06:59:26 +0000 
Processing by LocationsController#index as HTML 
Redirected to http://www.example.com/login 
Filter chain halted as :authenticate rendered or redirected 
Completed 302 Found in 2ms (ActiveRecord: 0.0ms) 
Started GET "/login" for 127.0.0.1 at 2017-10-17 06:59:26 +0000 
Processing by SessionsController#new as HTML 
    Rendering sessions/new.html.erb within layouts/empty 
    Rendered sessions/new.html.erb within layouts/empty (1.1ms) 
Completed 200 OK in 6ms (Views: 4.9ms | ActiveRecord: 0.0ms) 
    (0.4ms) ROLLBACK 

:

는 그래서 테스트 로그 ( docker-compose run web tail -f log/test.log)

그리고 내가 발견하는 것은 저를 당혹 꼬리. 그러나 어떤 이유로 카피 바라 (Capybara)는 이메일/패스워드 매개 변수를 전달하면서 루트 URL을 얻으려고 시도했다. 루트 URL은 사용자가 액세스 할 수없는 LocationsController # 인덱스에 매핑되므로 get Please log in to see this page 메시지와 함께/login으로 리디렉션되었습니다. 이 버튼이 실제로하는 일은 SessionsController # create에 POST를 보내는 것입니다. 당신이 수동으로 할 때 로그를 보는 경우에, 그 일이 정확히 무엇을 : 당신이 버튼이 버튼을 클릭하면 완전히 다른 요청을 수행 누를 때

는 는
web_1 | Started POST "/sessions" for 172.18.0.1 at 2017-10-17 07:02:19+0000 
web_1 | Processing by SessionsController#create as HTML 

그 이유를 카피 바라에서 작동하지 않을 수 있습니다 수동으로.

대단히 감사합니다.

답변

1

처음 몇 가지 설명이 있습니다.

    당신은 당신이 이미 설정되어 있기 때문에 RSpec.feature를 사용하는 경우 :type => :feature을 지정할 필요가 없습니다 RSpec.feature의 사용과 :type => :feature
  1. 에 의해 입증, 당신은 (기능 사양을 작성하는 요구 사양을 작성하지 않을
  2. .
  3. .

지금 form_tag 이후보기 코드에 대한 문제에 당신은 중첩 된 형태는 <form> 요소를 만든 다음 당신은 (주 내에서 직접 다른 <form> 요소가 : 그것은을 게시하는 것이 좋습니다 실제로 HTML은 erb가 아닌 실제 HTML이므로 사람들은 실제 HTML이 무엇인지 알 수 있습니다). 그것과 합치면 실제로는 HTML이 유효하지 않을 때 (중첩 된 양식이있는 경우) 실제 브라우저와 같은 방식으로 작동하지 않는 rack-test 드라이버 (js: true 메타 데이터 없음)를 사용하는 것으로 보이며 현재 행동으로 끝납니다 . 나는 실제 브라우저에서 그것을 사용할 때 내부 폼 요소가 무시되고 외부 양식 요소에 "post"와 동일한 메서드 특성이 있으므로 추측 할 수 있습니다. rack-test을 사용할 때 method 속성이없는 내부 양식 요소를 제출하고 있으므로 기본값은 "get"입니다.관련없는 <form class="m-t" role="form" action="/"> 폼 요소를 제거하면 모든 것이 작동합니다.

+0

Urgh은 완전히 중첩 된 양식을 놓쳤습니다. 그래서 지금 당신은 그것을 지적하고 있습니다! 고마워, 또한 기능 대 사양 사양에 대한 귀하의 지적했다. –