How to handle cookies when testing with Webrat?

▼魔方 西西 提交于 2019-12-13 01:27:06

问题


I'm writing Cucumber tests for a Sinatra based application using Webrat. For some tests I need to implement a scenario like

Given I am logged in as admin
When I am visiting "/"
Then I should see "Settings" 

I define steps like this:

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

On success a cookie is created

response.set_cookie(cookie_name, coockie_value)

and then verified in views when user tries to access admin pages via helper method:

def logged_in?
    request.cookies[cookie_name] == cookie_value
end

And it looks like Webrat doesn't store cookies. Tests don't report any error, but "logged_in?" in views is always false, like the cookie was not saved.

Am I doing something wrong? If this is just how Webrat works, what is the best workaround?


回答1:


The real problem is the way Sinatra is treating sessions in the test environment. Search the Google group for the discussion, but the real solution is to simply use:

use Rack::Session::Cookie

and not

enable :sessions

Using Selenium is nice but it's overkill as a solution for the OP's problem.




回答2:


The workaround is use Webrat with Selenium back end. It runs all tests in a separate Firefox window, so cookies or javascript is not a problem. The downside is extra time and resources required to run Firefox and do all the real clicks, rendering etc.




回答3:


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"


来源:https://stackoverflow.com/questions/681183/how-to-handle-cookies-when-testing-with-webrat

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!