2010-11-14 129 views
3

作爲我網站集成測試的一部分,我正在使用水豚黃瓜。似乎水豚不能模仿使用cookies。黃瓜測試中使用水豚的餅乾

比如我設置cookie時,在用戶登錄:

def sign_in(user) 
     cookies.permanent.signed[:remember_token] = [user.id, user.salt] 
     current_user = user 
    end 

然而,當我後來取使用cookies.inspect返回{} 是餅乾的價值這一個已知的水豚的限制?如果是這種情況,我如何測試多個請求的登錄用戶?

我要補充我的測試:

Scenario: User is signed in when they press Sign In 
Given I have an existing account with email "[email protected]" and password "123456" 
And I am on the signin page 
When I fill in "Email" with "[email protected]" 
And I fill in "Password" with "123456" 
And I press "Sign In" 
Then I should see "Welcome Bob Jones" 

回答

2

這裏展示的cookie的內容,同時運行的功能

https://gist.github.com/484787

+0

非常好。 我不知道你是否需要這個,但如果你只是使用機架測試以下應該讓你設置任何頭。 Capybara.current_session.driver.options || = {} Capybara.current_session.driver.options [:headers] || = {} Capybara.current_session.driver.options [:headers] [...] =。 .. – 2011-11-15 20:19:03

+0

這傢伙有這個代碼的寶石。 https://github.com/nruth/show_me_the_cookies – 2012-09-12 20:59:05

1

你爲什麼不只是運行測試的好辦法用硒?只需在想要使用真實瀏覽器運行的場景之前添加@selenium標籤即可。 :)

+0

我不是OP,但我知道我想讓測試儘可能快。所以任何時候我都可以避免打開瀏覽器。 – 2012-06-14 10:10:34

0

Capybara沒有用於讀取和設置Cookie的API。

但是,您可以很容易地模擬與Capyabara的登錄 - 只需訪問登錄鏈接即可。這會將您登錄,包括爲您設置所有Cookie。

要看到這個行動,只需看看我的example Rails app

4

下面是對我工作的一個步驟。它將cookie「admin_cta_choice」設置爲等於從輸入值派生的模型ID。

Given /I have selected CTA "([^"]+)"/ do |cta_name| 
    cta = Cta.find_by_name(cta_name) 
    raise "no cta with name '#{cta_name}'" if cta.nil? 

    k = "admin_cta_choice" 
    v = cta.id 

    case Capybara.current_session.driver 
    when Capybara::Poltergeist::Driver 
    page.driver.set_cookie(k,v) 
    when Capybara::RackTest::Driver 
    headers = {} 
    Rack::Utils.set_cookie_header!(headers,k,v) 
    cookie_string = headers['Set-Cookie'] 
    Capybara.current_session.driver.browser.set_cookie(cookie_string) 
    when Capybara::Selenium::Driver 
    page.driver.browser.manage.add_cookie(:name=>k, :value=>v) 
    else 
    raise "no cookie-setter implemented for driver #{Capybara.current_session.driver.class.name}" 
    end 
end