2009-03-25 5 views
1

나는 Webrat을 사용하여 Sinatra 기반 응용 프로그램을위한 Cucumber 테스트를 작성하고 있습니다. 몇 가지 테스트를 위해 나는 다음과 같은 단계를 정의Webrat으로 테스트 할 때 쿠키를 처리하는 방법은 무엇입니까?

Given I am logged in as admin 
When I am visiting "/" 
Then I should see "Settings" 

같은 시나리오를 구현해야합니다

Given /^I am logged in as "(.+)"$/ do |user| 
    visit "/login" 
    fill_in "login", :with => user 
    fill_in "password", :with => "123456" 
    click_button "Login" 
end 

When /^I am viewing "(.+)"$/ do |url| 
    visit(url) 
end 

Then /^I should see "(.+)"$/ do |text| 
    response_body.should =~ /#{text}/ 
end 
쿠키가
response.set_cookie(cookie_name, coockie_value) 

을 만든 다음 때 사용자가보기에 검증 성공

도우미 방법을 통해 관리자 페이지에 액세스하려고 시도합니다.

def logged_in? 
    request.cookies[cookie_name] == cookie_value 
end 

Webrat는 쿠키를 저장하지 않는 것 같습니다. 테스트는 오류를보고하지 않지만 "logged_in?" 쿠키가 저장되지 않은 것처럼보기에서 항상 false입니다.

내가 잘못 했나요? 이것이 바로 Webrat의 작동 방식 일 경우 최상의 해결 방법은 무엇입니까?

+0

Webrat의 고유 한 "브라우저"구현 또는 Selenium 백엔드를 사용하고 있습니까? 후자는 실제로 별도의 프로세스에서 응용 프로그램을 실행하므로 테스트 내에서 대부분의 Rails 상태에 액세스 할 수 없습니다. – emk

+0

emk : 감사합니다. Selenium 백엔드에서 작동합니다! –

답변

0

해결 방법은 셀레늄 백 엔드가있는 Webrat을 사용하는 것입니다. 별도의 Firefox 창에서 모든 테스트를 실행하므로 쿠키 또는 자바 스크립트가 문제가되지 않습니다. 단점은 렌더링, 파이어 폭스를 실행하고 모든 실제 클릭을 수행하는 데 필요한 여분의 시간과 자원 등등

0

당신은 당신의 logged_in? 단계 해킹 "/이^I가 로그인하고 감안할 때"할 수 :이

Given /^I am logged in as "(.+)"$/ do |user| 
    visit "/login" 
    fill_in "login", :with => user 
    fill_in "password", :with => "123456" 
    click_button "Login" 

    ApplicationController.class_eval <<-EOE 
     def current_user 
     @current_user ||= User.find_by_name(#{EOE}) 
     end 
    end 
EOE 
end 

이 단점은 다음과 같습니다

그것은
  1. 정말 다음과 같이보기 레벨 및 컨트롤러 수준의 문제를 함께 할 hackish.
  2. 모의하기 어려울 수 있습니다
+0

이것은 나를 위해 작동하지 않았다. – davetron5000

1

진짜 문제는시나가 테스트 환경에서 세션을 치료하는 방법이다 "로그 아웃". 간단하게 사용하는 논의는 구글 그룹을 검색하지만, 실제 솔루션을하는 것입니다

use Rack::Session::Cookie 

을 셀레늄은 좋은 그러나이 영업 이익의 문제에 대한 해결책으로 잔인한 사용하지

enable :sessions 

.