Hier meine http Basisauthentifizierung in der Application Controller Datei (application_controller.rb)
before_filter :authenticate
protected
def authenticate
authenticate_or_request_with_http_basic do |username, password|
username == "username" && password == "password"
end
end
und der Standardtest für die Indexaktion meines Home-Controllers (spec / controller / 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
Der Test wird aufgrund der Authentifizierungsmethode nicht ausgeführt. Ich könnte "before_filter: authenticate" kommentieren, um sie auszuführen, aber ich würde gerne wissen, ob es eine Möglichkeit gibt, sie mit der Methode arbeiten zu lassen.
Vielen Dank!
quelle
request
istnil
. Stattdessen müssen Sie einen env-Hash erstellenenv = {}
, diesen in Ihrer http_login-Methode aktualisieren und dann den env explizit wie in übergebenget '/', {}, env
.Entschuldigung, ich habe nicht genug gesucht, die Lösung scheint folgende zu sein:
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
quelle
Einige Antworten schlagen vor, festzulegen,
request.env
was unsicher ist, da eine Anfrage möglich istnil
und Sie am Ende davon betroffen sindprivate method env' called for nil:NilClass
, insbesondere wenn Sie einzelne Tests mit ausführenrspec -e
Der richtige Ansatz wird sein:
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
quelle
Wenn Sie Rspec zum Testen von Trauben-APIs verwenden, funktioniert die folgende Syntax
post :create, {:entry => valid_attributes}, valid_session
wo valid_session ist
{'HTTP_AUTHORIZATION' => credentials}
und
credentials = ActionController::HttpAuthentication::Token.encode_credentials("test_access1")
quelle
Dies sind großartige Lösungen für Controller- und Anforderungsspezifikationen.
Für Funktionstests mit Capybara finden Sie hier eine Lösung, mit der die HTTP Basic-Authentifizierung funktioniert:
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
Dann in Ihrer Spezifikation:
feature 'User does something' do include_context 'When authenticated' # test examples end
quelle
Meine Lösung:
stub_request(method, url).with( headers: { 'Authorization' => /Basic */ } ).to_return( status: status, body: 'stubbed response', headers: {} )
Verwenden Sie Edelstein Webmock
Sie können die Überprüfung durch Änderung verschärfen:
/Basic */ -> "Basic #{Base64.strict_encode64([user,pass].join(':')).chomp}"
URL - kann ein regulärer Ausdruck sein
quelle