2011-02-28 135 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