在 Rails 3.2.3 中使用 Cucumber 和 RSpec 测试 http 基本身份验证 [英] Testing http basic authentication with Cucumber and RSpec in Rails 3.2.3
问题描述
我想测试 Rails 3.2.3 中内置的基本 http 身份验证机制.我曾尝试在 RSpec 和 Cucumber 中测试 http 身份验证,但在这两个工具中都有一个失败的步骤.在 Cucumber 中,我在运行我的功能时收到以下消息:
I want to test the build-in basic http authentication mechanism in Rails 3.2.3. I have tried to test the http authentication in both RSpec and Cucumber but with a failing step in both tools. In Cucumber I get the following message on running my Feature:
When I perform HTTP authentication as "admin" with "test" # features/step_definitions/web_steps.rb:1
undefined method `env' for nil:NilClass (NoMethodError)
./features/step_definitions/web_steps.rb:3:in `/^I perform HTTP authentication as "([^"]*)" with "([^"]*)"$/'
features/sign_in_http.feature:4:in `When I perform HTTP authentication as "admin" with "test"'
这是我的 ApplicationController 类:
Here is my ApplicationController class:
class ApplicationController < ActionController::Base
protect_from_forgery
http_basic_authenticate_with :name => "admin", :password => "test"
end
Cucumber 中的步骤定义:
The step definition in Cucumber:
When /^I perform HTTP authentication as "([^"]*)" with "([^"]*)"$/ do |username, password|
@request.env["HTTP_AUTHORIZATION"] = "Basic " + Base64::encode64("username:password")
visit '/'
end
黄瓜功能:
Feature: Signing in via http
Scenario: HTTP sign-in
When I perform HTTP authentication as "admin" with "test"
Then I should see "Welcome to the app."
在 RSpec 中,http 身份验证步骤似乎通过了,但我从后续步骤中得到消息,它无法在页面上找到预期的内容,因为访问被拒绝":
In RSpec the http authentication step seems to pass but I get the message from the subsequent step, that it couldn't find the expected content on the page because "Access was denied":
1) ApplicationController sign in via http should be successful
Failure/Error: page.should have_content("Welcome to the app.")
expected there to be content "Welcome to the app." in "HTTP Basic: Access denied.
"
# ./spec/controllers/application_controller_spec.rb:12:in `block (3 levels) in <top (required)>'
这是我的相关规范:
require 'spec_helper'
describe ApplicationController do
describe "sign in via http" do
it "should be successful" do
@request.env["HTTP_AUTHORIZATION"] = "Basic " + Base64::encode64("admin:test")
visit '/'
response.should be_success
page.should have_content("Welcome to the app.")
end
end
end
我还尝试在黄瓜步骤中访问 http 授权行之前的根路径,但这给了我关于 @request 的 NilClass 的相同消息.使用定义的admin:test"凭据通过浏览器登录没问题,我可以看到我的应用程序的根页面.
如有任何建议,我将不胜感激.
I have also tried to visit the root path before the http authorization line in the cucumber step but this gave me the same message about the NilClass for @request.
Login via the browser with the defined "admin:test" credentials is no problem and I can see the root page of my app.
I would be thankful for any suggestions.
推荐答案
这是我如何让它工作的.关键是在您访问任何页面之前运行您的身份验证步骤,否则您已经通过身份验证.
Here's how I got it to work. The key is to run your authentication step before you visit any pages, else you've already failed the authentication.
在我的功能中我放了:
Background:
Given I perform HTTP authentication as "<id>/<password>"
When I go to the homepage
Then I should see "Text-that-you-should-see-on-your-home-page"
<小时>
HTTP 身份验证的步骤定义如下(我在其他地方找到了这段代码并添加了 puts 语句以查看发生了什么).
The step definition for the HTTP authentication is as follows (I found this code elsewhere and added the puts statements to see what was going on).
Given /^I perform HTTP authentication as "([^"]*)/([^"]*)"$/ do |username, password|
puts "id/pswd: #{username}/#{password}"
### Following works ONLY if performed first before even going to a page!!!
if page.driver.respond_to?(:basic_auth)
puts 'Responds to basic_auth'
page.driver.basic_auth(username, password)
elsif page.driver.respond_to?(:basic_authorize)
puts 'Responds to basic_authorize'
page.driver.basic_authorize(username, password)
elsif page.driver.respond_to?(:browser) && page.driver.browser.respond_to?(:basic_authorize)
puts 'Responds to browser_basic_authorize'
page.driver.browser.basic_authorize(username, password)
else
raise "I don't know how to log in!"
end
end
这篇关于在 Rails 3.2.3 中使用 Cucumber 和 RSpec 测试 http 基本身份验证的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!