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