Ruby Language
純粋なRSpec JSON APIテスト
サーチ…
シリアライザオブジェクトをテストしてコントローラに導入する
jsonapi.org仕様に準拠するようにAPIを構築したいとします。その結果は次のようになります。
{ "article": { "id": "305", "type": "articles", "attributes": { "title": "Asking Alexandria" } } }
シリアライザオブジェクトのテストは次のようになります。
# 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
シリアライザオブジェクトは次のようになります。
# 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
私たちが "シリアライザ"の仕様を実行すると、すべてが成功します。
それはかなり退屈です。 Article Serializerにタイプミスを導入してみましょう。タイプの代わりにtype: "articles"
type: "events"
返しましょうtype: "events"
とテストを再実行します。
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)>'
テストを実行したら、エラーを見つけるのはかなり簡単です。
エラーを修正したら( article
タイプに修正してarticle
)、Controllerに次のように紹介することができます:
# 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
この例は、記事に基づいています: http : //www.eq8.eu/blogs/30-pure-rspec-json-api-testing
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow