[RUBY] Worauf ich beim ActiveModel :: Serializer-Test gestoßen bin

Einführung

Ich gab ein Beispiel für das Schreiben eines Tests in ActiveModel :: Serializer Rspec. Ich bin jedoch auf das Schreiben eines weiteren Serializer-Tests gestoßen, daher werde ich ihn veröffentlichen.

Quellcode

In diesem Beispiel wird davon ausgegangen, dass Artikel und Kategorie eine Viele-zu-Viele-Beziehung haben und ein Zwischenmodell mit dem Namen "article_category.rb" haben.

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

Wenn ich diesen Serializer-Test schreibe, sieht er so aus

article_serializer_spec.rb


require 'rails_helper'

RSpec.describe ArticleSerializer, type: :serializer do
  context "Wenn ein neuer Artikel erstellt wird" do
    let(:article) { create(:article) }
    let(:category) { create(:category) }
    let(:article_category) do
      create(:article_category, category: category, article: article)
    end

    it "Ein serialisierter JSON wird erstellt" do
      serializer = ArticleSerializer.new(article)
      expect(serializer.to_json).to eq(article.to_json(:only => [:id, :title], :include => { :category })
    end
  end
end

Testergebnisse

Als ich es getestet habe, enthielt der zurückgegebene JSON nicht die has_many-bezogene Kategorie und blieb leer. Warum,,,

Lösungen

Es scheint, dass die Art und Weise, wie dieser Test geschrieben wurde, schlecht war, also habe ich ihn so geschrieben und er hat bestanden.

article_serializer_spec.rb


require 'rails_helper'

RSpec.describe ArticleSerializer, type: :serializer do
  context "Wenn ein neuer Artikel erstellt wird" do
    let!(:article) { create(:article) }
    let!(:category) { create(:category) }
    let!(:article_category) do
      create(:article_category, category: category, article: article)
    end

    it "Ein serialisierter JSON wird erstellt" do
      serializer = ArticleSerializer.new(article)
      expect(serializer.to_json).to eq(article.to_json(:only => [:id, :title], :include => { :category })
    end
  end
end

Die Änderung ist, dass let in let! Geändert wird. Wenn es "let" bleibt, ist das einzige im Beispiel erstellte Objekt "article". Der Grund ist, dass let ein Objekt nur erstellt, wenn es in einem Beispiel erscheint.

Es ist also eine gute Idee, "let!" In einem Beispiel wie diesem zu verwenden!

Recommended Posts

Worauf ich beim ActiveModel :: Serializer-Test gestoßen bin
Beachten Sie, dass ich beim Erstellen der Rails-Umgebung gestolpert bin
Worauf ich bei der Installation von Ruby unter Ubuntu gestoßen bin
Was ist, wenn ich eine finally-Klausel in die Try-with-Resources-Syntax schreibe?
Was ich bei der Migration von der Spring Boot 1.4-Serie zur 2.0-Serie getan habe
Was ich bei der Migration von der Spring Boot 1.5-Serie zur 2.0-Serie getan habe
Was sind die Regeln in JUnit?
Eine Notiz von dem, worauf ich gestoßen bin und was ich beim Aufholen von Laravel von Rails bemerkt habe
Was ich getan habe, als JSF keine Datenbankinformationen in der Ansicht anzeigen konnte
[Spring Boot] Ich bin auf einen Methodenaufruf-Count-Test gestoßen (Spock-Framework)
Ich erhalte folgende Fehler: Der Benutzer muss im Unit-Model-Test vorhanden sein
Was ich in der Wagby-Entwicklung untersucht habe Anmerkung 1
Ich habe das neue Yuan-Problem in Java ausprobiert
Ich bin auf Netbeans + JDBC + Amazon Athena gestoßen
Ich war süchtig nach dem Spring-Batch-Test
Ich habe die AutoValue-Bibliothek mit Intellij ausprobiert
Ich war süchtig nach Spring's @Transactional
[RSpec] Was ich feststeckte, als ich den Mailer-Test (Passwort-Reset-Prozess) schrieb
Ich bin auf die Java-Version in Android Studio gestoßen, daher werde ich sie zusammenfassen
Ich habe ein Programm zur Beurteilung von Primzahlen in Java erstellt
Ich habe versucht, die Sitzung in Rails zu organisieren
Ich habe ein Programm zur Beurteilung von Primzahlen in Java geschrieben
Was ich in Java gelernt habe (Teil 2) Was sind Variablen?
Ich möchte den Wert in Ruby erhalten
Ich bin gestolpert, als ich versucht habe, neo4j in der jenv-Umgebung zu verwenden. Machen Sie sich also eine Notiz