2016-12-28 1 views
0

Ich verwende devise_auth_token, um Benutzer für eine API zu authentifizieren. Ich möchte die Benutzer authentifizieren, bevor jeder Test ausgeführt wird, aber immer einen Fehler 401 erhalten. Wenn ich Postman für den Endpunkt mit den richtigen Headern verwende, funktioniert es, funktioniert aber nicht während der Tests.RSpec: Authentifizierung vor dem Test mit devise_auth_token

before(:each) do 
    @user = FactoryGirl.create(:user) 
end 

def get_auth 
    headers = @user.create_new_auth_token 
    auth = Hash.new 
    auth["client"] = headers["client"] 
    auth["access-token"] = headers["access-token"] 
    auth["uid"] = headers["uid"] 
    auth["expiry"] = headers["expiry"] 
    return auth 
end 

it "auth user should return success" do 
    get 'get_tasks_for_user', params: {uid: @user.uid}, headers: get_auth 
    expect(response).to have_http_status(200) 
end 

RSpec

TasksController auth user should return success 
    Failure/Error: expect(response).to have_http_status 200 
     expected the response to have status code 200 but it was 401 
+0

Können Sie 'sign_in @ user' in' before (: each) 'block nicht verwenden? –

Antwort

0

können Sie eine Hilfsmethode verwenden

#/spec/support/helpers/session_helper.rb 
module SessionHelper 

    def set_request_headers(resp) 
    { 'ACCEPT' => "application/json", 
     'Content-Type' => "application/json", 
     'access-token' => resp['access-token'], 
     'token-type' => resp['token-type'], 
     'client' => resp['client'], 
     'expiry' => resp['expiry'], 
     'uid' => resp['uid'] 
    } 
    end 

    def subdomain_login(uid, password, subdomain) 
    request_params = { 
     'email' => uid, 
     'password' => password 
    } 
    host! "#{subdomain}.lvh.me" 
    post "/portal/auth/sign_in", params: request_params 
    return set_request_headers(response.headers) 
    end 
end 

Achten Sie darauf, den folgenden Eintrag haben in Ihrem /spec/rails_helper

Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f } 
RSpec.configure do |config| 
config.include SessionHelper, :type => :request 
end 

Sieverwenden könnenin Ihren Tests. Hier ist ein Rspec-Beispiel.

post '/portal/system/locations', params: request_params.to_json, 
    headers: subdomain_login(user_id, password, subdomain)