Ruby Language
Test de l'API JSON Pure RSpec
Recherche…
Tester l'objet Serializer et le présenter au contrôleur
Disons que vous voulez construire votre API pour respecter la spécification jsonapi.org et que le résultat devrait ressembler à ceci :
{ "article": { "id": "305", "type": "articles", "attributes": { "title": "Asking Alexandria" } } }
L'objet Test for Serializer peut ressembler à ceci:
# 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
L'objet sérialiseur peut ressembler à ceci:
# 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
Lorsque nous exécutons nos spécifications "sérialiseurs", tout passe.
C'est assez ennuyeux. Introduisons une faute de frappe dans notre sérialiseur d'article: Au lieu de type: "articles"
, retournons le type: "events"
et relançons nos tests.
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)>'
Une fois le test effectué, il est assez facile de détecter l'erreur.
Une fois l’erreur corrigée (corrigez le type d’ article
), vous pouvez le présenter à Controller comme ceci:
# 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
Cet exemple est basé sur l'article: http://www.eq8.eu/blogs/30-pure-rspec-json-api-testing