1

我正在使用 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 的工作方式,那么最好的解决方法是什么?

4

3 回答 3

1

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

use Rack::Session::Cookie

不是

enable :sessions

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

于 2010-01-27T17:30:06.380 回答
0

You could have your "Given /^I am logged in" step hack 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

There are two downsides:

  1. It's really hackish to mix view-level and controller-level issues like this.
  2. It'll be difficult to mock up "logout"
于 2009-04-08T16:23:42.650 回答
0

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

于 2009-03-26T13:32:24.530 回答