2011-02-28 134 views
9

我試圖寫一個測試,它依賴於一些會話存儲的數據和我的情況是這樣的一個特點:軌,黃瓜,水豚:會話不持久

Scenario: Create offer 
    Given I am on the start offer page 
    When I select "Foo" from "bar" 
    And I press "Go on" 
    Then I should see "You are going to offer foo" 

通過使用調試器我發現,信息正確存儲在會話中,但每次新的請求我都會得到一個新的會話。

至少在每種情況下都不應該有工作會議?任何想法,爲什麼不是這種情況?

由於提前, 喬

版本:運行在軌道上2.3.10,黃瓜0.10.0,黃瓜護欄0.3.2,水豚0.4.1.2

+1

設置水豚的新主機,您使用了哪個驅動程序,您是否更改過任何水豚設置? – gertas 2011-03-03 12:39:46

+1

你可以發佈這個場景的相關步驟實現嗎? – 2011-03-03 15:41:17

+1

要回答你的第一個問題:是的,在場景中應該有持久會話狀態。 (它應該與默認的Rack :: Test驅動程序和Selenium一起工作。)爲什麼它可能不適合你,我不知道。 – 2011-03-07 21:16:48

回答

0

可能this bug

+0

@Ankur博客文章中的觀點對OP的「任何想法爲什麼不是這種情況?」都有合理的答案,所以我不確定爲什麼你認爲這不是一個答案(儘管鏈接 - 只有一點是有效的;在我的防守中,我在2.5年前寫了這個)。 – nickgrim 2013-12-05 18:06:50

+0

這對我很有用,因爲的確我的問題是水豚在更改域時會清除會話,即使我從/ some/url導航到本地主機:8080/some/other – 2013-12-30 13:51:26

5

某些驅動程序沒有明確的Cookie設置方式。這是一個哈克解決方法,直到他們整理出來:

def set_cookie(name, value, domain) 
    driver = Capybara.current_session.driver rescue nil 

    return unless driver 

    case driver 
    when Capybara::Driver::RackTest 
     driver.set_cookie "#{name}=#{value}" 
    when Capybara::Driver::Selenium 
     visit '/' # must visit the domain before we can set the cookie 

     br = driver.browser.send(:bridge) 

     br.addCookie({ 
     'name' => name, 
     'domain' => domain, 
     'value' => value, 
     'path' => '/', 
     'expires' => (Time.now + 100.years).to_i 
     }) 
    else 
     raise "Unsupported driver #{driver}" 
    end 
    end 
+1

只是沒有人會感到困惑:處理來自應用程序的cookies - 在我看來,您的答案是關於手動*設置cookie。 (儘管我不確定這是否解決了OP的問題。) – 2011-03-07 21:18:13

+0

你是對的,是的,如果你想強制登錄,這很有用,例如,如果一個普通的登錄過程是由openid/oauth方法驅動的這可能需要時間/需要互聯網連接。 – raggi 2011-03-20 04:36:47

+0

只是想補充一點,你的case語句應該是'case driver.class',否則你正在尋找一個大規模的散列 – 2011-05-12 19:49:49

4

我們有問題與會話丟失,由於水豚在中試切換主機名。情況如下:

# Good 
When I visit some page 
# will call 'http://capybarawhatever/some_page 
And I click the the button 
# will call 'http://capybarawhatever/some_new_page' 
Then I still have the session 

# Failing 
When I visit some page 
# will call 'http://capybarawhatever/some_page' 
And I do something that redirects me to "http://newhost.org/new_page" 
And I visit some page 
# No this may go to 'http://newhost.org/some_page 
Then I have lost my session 

這可能是值得調查的。您可以在您的會話中獲得current_url,並且您可以使用host! 'newhost.org'

+0

我會調查這個方向。雖然會話信息僅在上下文切換後存儲和使用,但該步驟中涉及上下文切換。 – xijo 2011-03-11 07:49:29

+0

我看起來水豚會話也可能[對相對URL敏感](http://blog.ardes.com/2010/4/28/capybara-and-rack-test-sessions-and-http-methods)。 – averell 2011-05-06 09:50:27