[RUBY] Ce que je suis tombé sur le test ActiveModel :: Serializer

introduction

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.

Code source

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

résultats de test

Lorsque je l'ai testé, le JSON renvoyé ne contenait pas la catégorie associée à has_many et est resté vide. Pourquoi,,,

Solution

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

Ce que je suis tombé sur le test ActiveModel :: Serializer
Notez que je suis tombé sur la construction de l'environnement Rails
Ce sur quoi je suis tombé lors de l'installation de Ruby sur Ubuntu
Que faire si j'écris une clause finally dans la syntaxe try-with-resources?
Ce que j'ai fait lors de la migration de la série Spring Boot 1.4 vers la série 2.0
Ce que j'ai fait lors de la migration de la série Spring Boot 1.5 vers la série 2.0
Quelles sont les règles de JUnit?
Une note de ce sur quoi j'ai trébuché et remarqué en rattrapant Laravel de Rails
Ce que j'ai fait lorsque JSF ne pouvait pas afficher les informations de la base de données dans la vue
[Spring Boot] Je suis tombé sur un test du nombre d'appels de méthode (framework Spock)
J'obtiens des erreurs: l'utilisateur doit exister dans le test du modèle unitaire
Ce que j'ai étudié dans le développement de Wagby Note 1
J'ai essayé le nouveau yuan à Java
Je suis tombé sur Netbeans + JDBC + Amazon Athena
J'étais accro au test Spring-Batch
J'ai essayé la bibliothèque AutoValue avec Intellij
J'étais accro au @Transactional de Spring
[RSpec] Ce que je suis resté bloqué lorsque j'ai écrit le test du mailer (processus de réinitialisation du mot de passe)
Je suis tombé sur la version Java dans Android Studio, je vais donc le résumer
J'ai créé un programme de jugement des nombres premiers en Java
J'ai essayé d'organiser la session en Rails
J'ai écrit un programme de jugement des nombres premiers en Java
Ce que j'ai appris en Java (partie 2) Que sont les variables?
Je veux obtenir la valeur en Ruby
J'ai trébuché lorsque j'ai essayé d'utiliser neo4j dans l'environnement jenv, alors prenez note