我正在使用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的工作方式,那么最好的解决方法是什么?
答案 0 :(得分:1)
真正的问题是Sinatra在测试环境中处理会话的方式。搜索Google小组进行讨论,但真正的解决方案是使用:
use Rack::Session::Cookie
和不
enable :sessions
使用Selenium很不错,但作为解决OP问题的解决方案太过分了。
答案 1 :(得分:0)
解决方法是使用带有Selenium后端的Webrat。它在一个单独的Firefox窗口中运行所有测试,因此cookie或javascript不是问题。缺点是运行Firefox并执行所有实际点击,渲染等所需的额外时间和资源。
答案 2 :(得分:0)
你可以让你的“Give / ^我已登录”步骤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
有两个缺点: