Notas de teste de APIs Rails Rspec

Notas de teste de APIs Rails Rspec

Estrutura de pastas

spec
|--- apis #do not put into controllers folder.
|--- your_api_test_spec.rb
|--- controllers
|--- models
|--- factories
|--- views
|--- helpers
|--- supports
|--- api_helper.rb
|--- authentication_helper.rb
|--- spec_helper.rb

* nota: não coloque sua pasta apis embaixo da pasta de controladores, caso contrário, ela será herdada com o controlador ActionController::TestCase::Behavior, Rake::Test::Methodsnão pode ser aplicada de acordo.

Auxiliar Rspec personalizado para Rake :: Test :: Métodos para escopos API.

@spec/supports/api_helper.rb


module ApiHelper
include
Rack::Test::Methods

def app
Rails.application
end
end

RSpec.configure do |config|
config
.include ApiHelper, :type=>:api #apply to all spec for apis folder
end

Ativar suportes Spec_helper

@spec/spec_helper.rb
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}

Especificações de teste de API

certifique-se de que seu grupo de teste de amostra tenha type: api, então ele incluirá Rake :: Test :: Methods for ( get,post,put,delete) requests

@spec/apis/authentication_spec.rb

require
"spec_helper"

describe
"API authentication" , :type => :api do

let
!(:user) { FactoryGirl.create(:user) }

it
"making a request without cookie token " do
get
"/api/v1/items/1",:formate =>:json
last_response
.status.should eql(401)
error
= {:error=>'You need to sign in or sign up before continuing.'}
last_response
.body.should eql(error.to_json)
end

end

ActionController::TestCase::Behavior vs Rack::Test::Methods

Rspec-Rails inclui ActionController::TestCase::Behaviorpara simular solicitações de controlador.

então você poderia fazer


require
"spec_helper"

describe
Api::V1::SessionsController , :type => :api do

let
!(:user) { FactoryGirl.create(:user) }

it
"making a request without cookie token " do
get
:index
response
.status.should eql(401)
error
= {:error=>'You need to sign in or sign up before continuing.'}
response
.body.should eql(error.to_json)
end

end

Pontos de diferenças:

  • Rake::Test::Methodspoderia consultar o url “/ api / v1 / xxxx”, mas apenas executar ações dentro do escopo do controlador atual.ActionController::TestCase::Behavior
  • a resposta em chamada: last_response, em chamada: resposta.Rake::Test::MethodsActionController::TestCase::Behavior

* Observações, se você alterar sua pasta spec / apis para api, descobrirá que last_repsonsenão está mais funcionando. Isso ocorre porque o escopo: type =>: api foi misturado com o comportamento padrão do ActionController.

Um passo a frente

Auxiliar de login reutilizável.

@spec/supports/authentication_helper.rb

module AuthenticationHelper
def sign_in_as_a_valid_user
@user ||= FactoryGirl.create(:user)
@user.reset_authentication_token! unless @user.authentication_token
set_cookie
"authentication_token=#{@user.authentication_token}"
end
end

RSpec.configure do |config|
config
.include AuthenticationHelper, :type=>:api
end

* Observações: O exemplo acima usou autenticação de cookie baseada em token. Portanto, você pode mudar para autenticação de base ou autenticação baseada em token com base em suas próprias necessidades.

Criou um usuário conectado em seu teste

use antes de cada bloco ou antes de todos ou inclua o método auxiliar em seu bloco de asserção

require "spec_helper"

describe
"API Items Controller", :type => :api do

before
:each do
sign_in_as_a_valid_user

end

it
"fetch all items" do
#or include the helper method here
sign_in_as_a_valid_user

...
end
end