Ruby 使用Webrat进行测试时如何处理cookie?

Ruby 使用Webrat进行测试时如何处理cookie?,ruby,testing,sinatra,webrat,Ruby,Testing,Sinatra,Webrat,我正在使用Webrat为基于Sinatra的应用程序编写Cucumber测试。对于一些测试,我需要实现如下场景 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

我正在使用Webrat为基于Sinatra的应用程序编写Cucumber测试。对于一些测试,我需要实现如下场景

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
成功后,将创建一个cookie

response.set_cookie(cookie_name, coockie_value)
然后在用户尝试通过帮助器方法访问管理页面时在视图中验证:

def logged_in?
    request.cookies[cookie_name] == cookie_value
end
而且看起来Webrat不储存饼干。测试不会报告任何错误,但视图中的“logged_in?”始终为false,就像cookie未保存一样


我做错什么了吗?如果Webrat就是这样工作的,那么最好的解决方法是什么?

解决方法是使用Webrat和Selenium后端。它在一个单独的Firefox窗口中运行所有测试,因此Cookie或javascript不是问题。缺点是需要额外的时间和资源来运行Firefox并执行所有真正的点击、渲染等操作。

解决方法是使用Webrat和Selenium后端。它在一个单独的Firefox窗口中运行所有测试,因此Cookie或javascript不是问题。缺点是需要额外的时间和资源来运行Firefox并执行所有真正的点击、渲染等操作。

您可以让您的“Given/^I am logged in”步骤hack
登录?

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
Given/^我以“(.+)”$/do |用户身份登录|
访问“/登录”
在“登录”中填写:with=>user
填写“密码”:使用=>“123456”
单击按钮“登录”
ApplicationController.class\u eval您可以让“给定的/^I已登录”步骤hack
登录?

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
Given/^我以“(.+)”$/do |用户身份登录|
访问“/登录”
在“登录”中填写:with=>user
填写“密码”:使用=>“123456”
单击按钮“登录”

ApplicationController.class_eval真正的问题是Sinatra在测试环境中处理会话的方式。搜索谷歌小组进行讨论,但真正的解决方案是简单地使用:

use Rack::Session::Cookie
不是

enable :sessions

使用Selenium很好,但作为OP问题的解决方案,这太过分了。

真正的问题是Sinatra在测试环境中处理会话的方式。搜索谷歌小组进行讨论,但真正的解决方案是简单地使用:

use Rack::Session::Cookie
不是

enable :sessions

使用Selenium很好,但作为OP问题的解决方案,这太过分了。

您是使用Webrat的本机“浏览器”实现,还是使用Selenium后端?后者实际上是在一个单独的进程中运行您的应用程序,这意味着您无法从测试中访问大多数Rails状态。emk:谢谢,它与Selenium后端一起工作!您使用的是Webrat的本机“浏览器”实现,还是Selenium后端?后者实际上是在一个单独的进程中运行您的应用程序,这意味着您无法从测试中访问大多数Rails状态。emk:谢谢,它与Selenium后端一起工作!