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::Methods
nã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::Behavior
para 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::Methods
poderia 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::Methods
ActionController::TestCase::Behavior
* Observações, se você alterar sua pasta spec / apis para api, descobrirá que last_repsonse
nã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