Ruby Language
Pruebas de la API JSON de RSpec pura
Buscar..
Probando el objeto Serializador y presentándolo al Controlador
Digamos que quieres construir tu API para cumplir con la especificación jsonapi.org y el resultado debería ser:
{ "article": { "id": "305", "type": "articles", "attributes": { "title": "Asking Alexandria" } } }
La prueba para el objeto Serializador puede verse así:
# spec/serializers/article_serializer_spec.rb require 'rails_helper' RSpec.describe ArticleSerializer do subject { described_class.new(article) } let(:article) { instance_double(Article, id: 678, title: "Bring Me The Horizon") } describe "#as_json" do let(:result) { subject.as_json } it 'root should be article Hash' do expect(result).to match({ article: be_kind_of(Hash) }) end context 'article hash' do let(:article_hash) { result.fetch(:article) } it 'should contain type and id' do expect(article_hash).to match({ id: article.id.to_s, type: 'articles', attributes: be_kind_of(Hash) }) end context 'attributes' do let(:article_hash_attributes) { article_hash.fetch(:attributes) } it do expect(article_hash_attributes).to match({ title: /[Hh]orizon/, }) end end end end end
El objeto serializador puede verse así:
# app/serializers/article_serializer.rb class ArticleSerializer attr_reader :article def initialize(article) @article = article end def as_json { article: { id: article.id.to_s, type: 'articles', attributes: { title: article.title } } } end end
Cuando ejecutamos nuestras especificaciones de "serializadores" todo pasa.
Eso es bastante aburrido. Introduzcamos un error tipográfico en nuestro serializador de artículos: en lugar de type: "articles"
volvamos a type: "events"
y volver a ejecutar nuestras pruebas.
rspec spec/serializers/article_serializer_spec.rb .F. Failures: 1) ArticleSerializer#as_json article hash should contain type and id Failure/Error: expect(article_hash).to match({ id: article.id.to_s, type: 'articles', attributes: be_kind_of(Hash) }) expected {:id=>"678", :type=>"event", :attributes=>{:title=>"Bring Me The Horizon"}} to match {:id=>"678", :type=>"articles", :attributes=>(be a kind of Hash)} Diff: @@ -1,4 +1,4 @@ -:attributes => (be a kind of Hash), +:attributes => {:title=>"Bring Me The Horizon"}, :id => "678", -:type => "articles", +:type => "events", # ./spec/serializers/article_serializer_spec.rb:20:in `block (4 levels) in <top (required)>'
Una vez que haya ejecutado la prueba, es bastante fácil detectar el error.
Una vez que solucione el error (corrija el tipo para que sea un article
), puede presentarlo al Controlador de esta manera:
# app/controllers/v2/articles_controller.rb module V2 class ArticlesController < ApplicationController def show render json: serializer.as_json end private def article @article ||= Article.find(params[:id]) end def serializer @serializer ||= ArticleSerializer.new(article) end end end
Este ejemplo se basa en el artículo: http://www.eq8.eu/blogs/30-pure-rspec-json-api-testing