J'ai donné un exemple de la façon d'écrire un test dans ActiveModel :: Serializer Rspec. Cependant, je suis tombé sur l'écriture d'un autre test Serializer, donc je le posterai.
Dans cet exemple, supposons que l'article et la catégorie ont une relation plusieurs-à-plusieurs et ont un modèle intermédiaire appelé ʻarticle_category.rb`.
article.rb
class Article < ApplicationRecord
  has_many :article_categories
  has_many :categories, through: :article_categories
end
article_serializer.rb
class ArticleSerializer < ActiveModel::Serializer
  attributes :id, :title
  has_many :categories
end
Quand j'écris ce test de sérialiseur, il ressemble à ceci
article_serializer_spec.rb
require 'rails_helper'
RSpec.describe ArticleSerializer, type: :serializer do
  context "Lorsqu'un nouvel article est créé" do
    let(:article) { create(:article) }
    let(:category) { create(:category) }
    let(:article_category) do
      create(:article_category, category: category, article: article)
    end
    it "Un JSON sérialisé est créé" do
      serializer = ArticleSerializer.new(article)
      expect(serializer.to_json).to eq(article.to_json(:only => [:id, :title], :include => { :category })
    end
  end
end
Lorsque je l'ai testé, le JSON renvoyé ne contenait pas la catégorie associée à has_many et est resté vide. Pourquoi,,,
Il semble que la façon dont ce test a été écrit était mauvaise, alors je l'ai écrit comme ça et il a réussi.
article_serializer_spec.rb
require 'rails_helper'
RSpec.describe ArticleSerializer, type: :serializer do
  context "Lorsqu'un nouvel article est créé" do
    let!(:article) { create(:article) }
    let!(:category) { create(:category) }
    let!(:article_category) do
      create(:article_category, category: category, article: article)
    end
    it "Un JSON sérialisé est créé" do
      serializer = ArticleSerializer.new(article)
      expect(serializer.to_json).to eq(article.to_json(:only => [:id, :title], :include => { :category })
    end
  end
end
Le changement est que «let» est remplacé par «let!».
Si vous laissez let tel quel, le seul objet créé dans l'exemple est ʻarticle`.
La raison en est que «let» ne crée un objet que lorsqu'il apparaît dans un exemple.
C'est donc une bonne idée d'utiliser «let!» Dans un exemple comme celui-ci!
Recommended Posts