【问题标题】:How to handle cookies when testing with Webrat?使用 Webrat 进行测试时如何处理 cookie?
【发布时间】:2010-01-28 01:30:06
【问题描述】:

我正在使用 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 不存储 cookie。测试不报告任何错误,但“logged_in?”在视图中总是错误的,就像 cookie 没有保存一样。

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

【问题讨论】:

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

标签: ruby testing sinatra webrat


【解决方案1】:

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

use Rack::Session::Cookie

不是

enable :sessions

使用 Selenium 很好,但作为 OP 问题的解决方案,它有点过头了。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      你可以让你的“给定/^我已登录”步骤破解logged_in?

      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
      

      有两个缺点:

      1. 真的像这样混合视图级别和控制器级别的问题是不合时宜的。
      2. 模拟“注销”会很困难

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-09-27
        • 1970-01-01
        • 1970-01-01
        • 2022-01-09
        • 2010-11-20
        • 1970-01-01
        相关资源
        最近更新 更多