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.
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
Als ich es getestet habe, enthielt der zurückgegebene JSON nicht die has_many-bezogene Kategorie
und blieb leer. Warum,,,
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