API em ruby ~ Parte 2

Após publicar a primeira parte de como criar uma simples API em ruby (veja aqui), recebi alguns feedbacks querendo a continuação. Fiquei bem feliz por fazer conteúdo que gere interesse, realmente não era algo que eu esperava haha.

Levando em consideração esses feedbacks, irei abordar nesta continuação a implementação do serializer e os testes unitários (a primeira parte do projeto esta aqui).


Serializer

Qual é a importância do serializer em uma API? Conseguimos controlar facilmente como o objeto será retornado. Como nesse post também estou aprendendo, decidi usar a gem da Netflix (Fast JSON API) — aqui na bionexo estamos usando Active Model Serializer(AMS).

O primeiro passo é configurar a gem no projeto; para isso, abra o arquivo Gemfile.rb e inclua em uma nova linha gem ‘fast_jsonapi’.

Execute no terminal o comando $ bundle install, depois iremos criar o arquivo do serializer, nesse caminho app/serializers/post_serializer.rb. E iremos colocar as informações abaixo:

No terminal iremos iniciar o console do rails e validar o serializer.

$ bundle exec rails c 
2.3.3 :001 > PostSerializer.new(Post.last).serialized_json
 Post Load (0.6ms) SELECT "posts".* FROM "posts" ORDER BY "posts"."id" DESC LIMIT $1 [["LIMIT", 1]]
=> “{\”data\”:{\”id\”:\”10\”,\”type\”:\”post\”,\”attributes\”:{\”title\”:\”titulo 10\”,\”body\”:\”conteudo\”,\”created_at\”:\”2018–02–15T10:48:54.298Z\”}}}”

Validado que o Serializer esta funcionando, iremos alterar a controller para incluir o nosso PostSerializer.

Para testar vamos iniciar o servidor do rails com o comando $ bundle exec rails s depois acessar a rota e visualizar o retorno, conforme imagem abaixo:

Obs: Eu realizei um Benchmark com a gem da AMS e da Netflix, realmente a da netflix é mais rápida, claro que testei com uma massa de dados pequena.


Teste de unidade

Antes de iniciar com os testes unitários para nossa API, gostaria de dizer que para mim sempre foi um desafio criar testes, talvez porque me apresentaram como um bicho de sete cabeças, então sempre tinha esse bloqueio ao criar um teste. Até que comecei a fazer mentoria focada em testes com o narciso.benigno e em uma das mentorias ele me ensinou uma lógica para construir os testes:

CENÁRIO + EXECUÇÃO + ASSERÇÃO

Na parte dos cenários é onde devo separar todos os dados necessários para que o teste execute. A execução o próprio nome já diz, é onde vou chamar aquilo que gostaria de testar e a asserção seria a validação do teste. Depois disso nunca mais tive dificuldade em criar testes, parece bobo mas funcionou comigo e nunca mais tive dúvidas de como construir um teste.

Bom, agora sim, vamos criar os nossos testes focados na API para isso vamos usar o rspec-rails, abra o arquivo Gemfile e adicione para o ambiente de desenvolvimento e teste.

Para instalar as dependências no projeto execute $ bundle install, agora iremos inicializar o diretório de teste executando $ rails generate rspec:install , e o comando $ bundle exec rspec para executar os testes.

Crie o arquivo spec/controllers/api/v1/posts_controller_spec.rb, neste arquivo criei os testes abaixo:

Criei o arquivo spec/serializers/post_serializer_spec.rb, para fazer o teste do serializador.

Acredito que nesse post consegui concluir de forma simples e objetiva a implementação do serializer e o teste de unidade focado na API.


“You can interact with a computer. And if you do it just right, you can make wonderful things happen.” — Jonathan Sachs