2010-11-14 66 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