Capybara的HTTP基本身份验证

Cim*_*imm 33 authentication testing ruby-on-rails webrat capybara

我正在为我的Rails 3应用程序编写一些RSpec测试,并尝试从Webrat切换到Capybara.到目前为止这么好,但应用程序使用HTTP基本身份验证来授权我的管理员用户,任何想法如何与Capybara测试?

这是我目前的Webrat步骤:

it 'should authenticate for admin' do
  basic_auth('user', 'secret')
  visit '/admin'
  response.status.should eql 200
  response.status.should_not eql 401
end
Run Code Online (Sandbox Code Playgroud)

我如何与Capybara一起做这个?谢谢!

And*_*erg 42

我用它page.driver.basic_authorize(name, password)代替了它

更新:

目前,在Capybara升级之后,我正在使用这一堆解决方法:

if page.driver.respond_to?(:basic_auth)
  page.driver.basic_auth(name, password)
elsif page.driver.respond_to?(:basic_authorize)
  page.driver.basic_authorize(name, password)
elsif page.driver.respond_to?(:browser) && page.driver.browser.respond_to?(:basic_authorize)
  page.driver.browser.basic_authorize(name, password)
else
  raise "I don't know how to log in!"
end
Run Code Online (Sandbox Code Playgroud)


Szy*_*był 25

默认的Capybara驱动程序rack-test有一个Basic HTTP Auth basic_authorize方法(带别名authorize),digest_authorizeDigest HTTP Auth,你可以在这里找到它们:https://github.com/brynary/rack-test/blob/master /lib/rack/test.rb

所以你可以这样做:

page.driver.browser.authorize 'login', 'password'
Run Code Online (Sandbox Code Playgroud)

或者您可以为Basic HTTP Auth编写一个简单的帮助器:

def basic_auth(user, password)
  encoded_login = ["#{user}:#{password}"].pack("m*")
  page.driver.header 'Authorization', "Basic #{encoded_login}"
end
Run Code Online (Sandbox Code Playgroud)

  • 值得注意的是,此方法通过向请求添加"Authorization"标头来工作,因此您需要在"访问"之前调用此方法. (2认同)
  • 当我尝试使用第一个选项时,出现错误:#<Capybara :: Poltergeist :: Browser:0x007fae7c592540>(NoMethodError)的未定义方法'authorize'有人看到过类似的东西吗? (2认同)

Pis*_*tos 7

没有一个page.driver.*解决方案对我有用。我使用的是 Poltergeist,而不是 Selenium,所以这可能与它有关。这是有效的:

RSpec.shared_context "When authenticated" do
  before do
    username = 'yourusername'
    password = 'yourpassword'
    visit "http://#{username}:#{password}@#{Capybara.current_session.server.host}:#{Capybara.current_session.server.port}/"
  end
end
Run Code Online (Sandbox Code Playgroud)

然后,在您的规范中:

feature "Your feature", js: true do
  include_context "When authenticated"

  # Your test code here...
end
Run Code Online (Sandbox Code Playgroud)