Rails / Rspec Make 테스트는 http 기본 인증으로 통과합니다.
여기 응용 프로그램 컨트롤러 파일 (application_controller.rb)의 http 기본 인증
before_filter :authenticate
protected
def authenticate
authenticate_or_request_with_http_basic do |username, password|
username == "username" && password == "password"
end
end
내 홈 컨트롤러의 인덱스 작업에 대한 기본 테스트 (spec / controllers / home_controller_spec.rb)
require 'spec_helper'
describe HomeController do
describe "GET 'index'" do
it "should be successful" do
get 'index'
response.should be_success
end
end
인증 방법으로 인해 테스트가 실행되지 않습니다. 나는 그들을 실행하기 위해 "before_filter : authenticate"에 주석을 달 수 있지만 그것들이 그 방법으로 작동하도록 만드는 방법이 있는지 알고 싶습니다.
감사합니다!
업데이트 (2013) : Matt Connolly는 요청 및 컨트롤러 사양에서도 작동하는 GIST를 제공했습니다 : http://gist.github.com/4158961
실행할 테스트가 많고 매번 포함하고 싶지 않은 경우이를 수행하는 또 다른 방법 (DRYer 코드) :
/spec/support/auth_helper.rb 파일을 만듭니다.
module AuthHelper
def http_login
user = 'username'
pw = 'password'
request.env['HTTP_AUTHORIZATION'] = ActionController::HttpAuthentication::Basic.encode_credentials(user,pw)
end
end
테스트 사양 파일에서 :
describe HomeController do
render_views
# login to http basic auth
include AuthHelper
before(:each) do
http_login
end
describe "GET 'index'" do
it "should be successful" do
get 'index'
response.should be_success
end
end
end
여기에 크레딧
충분히 찾지 못해 죄송합니다. 해결책은 다음과 같습니다.
describe "GET 'index'" do
it "should be successful" do
@request.env["HTTP_AUTHORIZATION"] = "Basic " + Base64::encode64("username:password")
get 'index'
response.should be_success
end
end
일부 답변은 request.env
요청이 될 수 있고 특히 단일 테스트를 실행할 때으로 nil
끝날 수 있기 때문에 안전하지 않은 설정 을 제안합니다.private method env' called for nil:NilClass
rspec -e
올바른 접근 방식은 다음과 같습니다.
def http_login
user = 'user'
password = 'passw'
{
HTTP_AUTHORIZATION: ActionController::HttpAuthentication::Basic.encode_credentials(user,password)
}
end
get 'index', nil, http_login
post 'index', {data: 'post-data'}, http_login
Rspec을 사용하여 Grape API를 테스트 할 때 다음 구문이 작동합니다.
post :create, {:entry => valid_attributes}, valid_session
valid_session은
{'HTTP_AUTHORIZATION' => credentials}
과
credentials = ActionController::HttpAuthentication::Token.encode_credentials("test_access1")
컨트롤러 및 요청 사양을위한 훌륭한 솔루션입니다.
Capybara를 사용한 기능 테스트의 경우 HTTP 기본 인증이 작동하도록하는 솔루션이 있습니다.
spec / support / when_authenticated.rb
RSpec.shared_context 'When authenticated' do
background do
authenticate
end
def authenticate
if page.driver.browser.respond_to?(:authorize)
# When headless
page.driver.browser.authorize(username, password)
else
# When javascript test
visit "http://#{username}:#{password}@#{host}:#{port}/"
end
end
def username
# Your value here. Replace with string or config location
Rails.application.secrets.http_auth_username
end
def password
# Your value here. Replace with string or config location
Rails.application.secrets.http_auth_password
end
def host
Capybara.current_session.server.host
end
def port
Capybara.current_session.server.port
end
end
그런 다음 사양에서 :
feature 'User does something' do
include_context 'When authenticated'
# test examples
end
'developer tip' 카테고리의 다른 글
ExecutorService를 Java의 데몬으로 전환 (0) | 2020.11.13 |
---|---|
주어진 문자열을 식별하는 방법은 16 진수 색상 형식입니다. (0) | 2020.11.13 |
git merge의 기본값을 --no-ff --no-commit으로 만들려면 어떻게해야합니까? (0) | 2020.11.13 |
$ (document) .scrollTop ()은 항상 0을 반환합니다. (0) | 2020.11.13 |
Elixir에서 맵 키를 문자열에서 원자로 변환하는 방법 (0) | 2020.11.13 |