[RUBY] [1er] RSpec débutant a essayé d'écrire ModelSpec en tant que débutant

introduction

Ravi de vous rencontrer. Tout d'abord, je voudrais me présenter brièvement. Je suis diplômé qui a étudié principalement Ruby au DMM WEB CAMP de mai 2020 à septembre 2020 et change actuellement de poste. L'autre jour, une session d'étude pour les débutants organisée avec la gentillesse du mâle RSpec Junichi Ito @jnchito (RSpec Beginners !!).

J'ai ressenti en écrivant un test en utilisant RSpec dans le portfolio, Si vous êtes un débutant comme moi, j'ai résumé les "points d'achoppement" tels que "je vais trébucher ici: penser:" et "je ne sais pas ici: étreindre:" du point de vue d'un débutant. De plus, au fur et à mesure, je voulais parfois un exemple de code de test concret de la fonction que je voulais écrire, alors je me sert également de revue de moi-même, mais si cet article est un peu utile pour les débutants de RSpec Je suis heureux.

Que faire dans cet article

Non couvert dans cet article

supposition

Tester le modèle d'utilisateur individuel

① Introduction d'un modèle d'utilisateur individuel

Tout d'abord, je vais vous montrer le modèle d'utilisateur individuel. En fait, il existe des associations comme les modèles préférés, mais nous ne les traiterons pas cette fois, nous les avons donc délibérément supprimées.

①user.rb


class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable

  has_many :rooms, dependent: :destroy
  has_many :messages, dependent: :destroy
  has_many :notifications, dependent: :destroy
  
  validates :last_name, presence: true, length: { maximum: 10 }
  validates :first_name, presence: true, length: { maximum: 10 }
  validates :kana_last_name, presence: true, length: { maximum: 10 }
  validates :kana_first_name, presence: true, length: { maximum: 10 }
  validates :email, presence: true, length: { maximum: 30 }
  validates :postal_code, presence: true, length: { minimum: 7, maximum: 7 }
  validates :address, presence: true, length: { maximum: 30 }
  validates :phone_number, presence: true, length: { maximum: 12 }
  validates :introduction, length: { maximum: 200 }

  attachment :profile_image

  def full_name
    last_name + " " + first_name
  end

  def kana_full_name
    kana_last_name + " " + kana_first_name
  end
end

(2) Utilisez FactoryBot et préparez les données utilisateur à l'avance.

** Point d'arrêt: étreindre: "Qu'est-ce que FactoryBot?" ** FactoryBot est également décrit dans "Everyday Rails-Introduction to Rails Testing with RSpec". Vous pouvez l'utiliser en insérant une gemme, vous pouvez donc essayer de rechercher avec FactoryBot. Je ne savais pas au début, mais ça va. C'est juste une chose pratique que vous pouvez simplement décrire les données de test et les affecter à une variable d'instance ou une variable locale telle que @user dans ③. Son utilisation est décrite dans ③. Tout d'abord, lancez $ bin / rails g factory_bot: model user pour créer un fichier. Une fois créé, essayez d'insérer des exemples de données en fonction des colonnes de votre application.

②spec/factories/users.rb


FactoryBot.define do
  #Utilisez FactoryBot et préparez les données utilisateur à l'avance
  factory :user do
    last_name { "tester" }
    first_name { "Taro" }
    kana_last_name { "tester" }
    kana_first_name { "Taro" }
    email { "[email protected]" }
    postal_code { "1234567" }
    address { "123, Chiyoda-ku, Tokyo-12-1" }
    phone_number { "12345678910" }
    password { "testtaro" }
  end
end

③ Description du test spécifique

Je vais enfin écrire un test. repos assuré. Je trébucherai correctement plus tard. Exécution de $ bin / rails g rspec: model l'utilisateur créera user_spec.rb dans le dossier spec / models. Le code de test du modèle (validation, méthode auto-créée, etc.) sera écrit dans ce fichier.

Voici un exemple complet.

③spec/models/user_spec.rb


require 'rails_helper'

RSpec.describe User, type: :model do

  before do
    @user = FactoryBot.build(:user)
  end

  describe "Test de validation" do
    it "Nom, prénom, nom kana, prénom kana, mail, code postal, adresse, numéro de téléphone, le mot de passe doit être valide" do
      expect(@user).to be_valid
    end

    it "Doit être invalide sans nom" do
      @user.last_name = ""
      @user.valid?
      expect(@user.errors[:last_name]).to include("Entrez s'il vous plait")
    end

    it "Doit être invalide à moins que le nom de famille ne comporte 10 caractères ou moins" do
      @user.last_name = "a" * 11
      @user.valid?
      expect(@user.errors[:last_name]).to include("Veuillez saisir moins de 10 caractères")
    end

    it "S'il n'y a pas de nom, il est dans un état invalide" do
      @user.first_name = ""
      @user.valid?
      expect(@user.errors[:first_name]).to include("Entrez s'il vous plait")
    end

    it "Le nom doit comporter 10 caractères ou moins et ne doit pas être valide" do
      @user.first_name = "a" * 11
      @user.valid?
      expect(@user.errors[:first_name]).to include("Veuillez saisir moins de 10 caractères")
    end
    
    it "Doit être invalide sans le nom de famille Kana" do
      @user.kana_last_name = ""
      @user.valid?
      expect(@user.errors[:kana_last_name]).to include("Entrez s'il vous plait")
    end

    it "Le nom de famille Kana doit comporter 10 caractères ou moins pour être invalide" do
      @user.kana_last_name = "a" * 11
      @user.valid?
      expect(@user.errors[:kana_last_name]).to include("Veuillez saisir moins de 10 caractères")
    end

    it "S'il n'y a pas de nom kana, il est dans un état invalide" do
      @user.kana_first_name = ""
      @user.valid?
      expect(@user.errors[:kana_first_name]).to include("Entrez s'il vous plait")
    end

    it "Le nom kana doit comporter 10 caractères ou moins pour être invalide" do
      @user.kana_first_name = "a" * 11
      @user.valid?
      expect(@user.errors[:kana_first_name]).to include("Veuillez saisir moins de 10 caractères")
    end
    
    it "Doit être invalide sans adresse e-mail" do
      @user.email = ""
      @user.valid?
      expect(@user.errors[:email]).to include("Entrez s'il vous plait")
    end

    it "L'adresse e-mail doit contenir 30 caractères ou moins pour être invalide" do
      @user.email = "a" * 31
      @user.valid?
      expect(@user.errors[:email]).to include("Veuillez saisir 30 caractères ou moins.")
    end
    
    it "S'il n'y a pas de code postal, il est invalide" do
      @user.postal_code = ""
      @user.valid?
      expect(@user.errors[:postal_code]).to include("Entrez s'il vous plait")
    end

    it "Si le code postal comporte moins de 7 caractères, il n'est pas valide" do
      @user.postal_code = "a" * 6
      @user.valid?
      expect(@user.errors[:postal_code]).to include("Veuillez saisir au moins 7 caractères")
    end

    it "Si le code postal dépasse 7 caractères, il n'est pas valide." do
      @user.postal_code = "a" * 8
      @user.valid?
      expect(@user.errors[:postal_code]).to include("Veuillez saisir moins de 7 caractères")
    end
    
    it "S'il n'y a pas d'adresse, c'est invalide" do
      @user.address = ""
      @user.valid?
      expect(@user.errors[:address]).to include("Entrez s'il vous plait")
    end

    it "L'adresse doit contenir 30 caractères ou moins pour être invalide" do
      @user.address = "a" * 31
      @user.valid?
      expect(@user.errors[:address]).to include("Veuillez saisir moins de 30 caractères")
    end
    
    it "S'il n'y a pas de numéro de téléphone, il n'est pas valide" do
      @user.phone_number = ""
      @user.valid?
      expect(@user.errors[:phone_number]).to include("Entrez s'il vous plait")
    end

    it "Le numéro de téléphone doit comporter 12 caractères ou moins pour être invalide" do
      @user.phone_number = "a" * 13
      @user.valid?
      expect(@user.errors[:phone_number]).to include("Veuillez saisir moins de 12 caractères")
    end

    it "Le texte d'auto-introduction doit comporter 200 caractères ou moins pour être invalide." do
      @user.introduction = "a" * 201
      @user.valid?
      expect(@user.errors[:introduction]).to include("Veuillez saisir moins de 200 caractères")
    end

    it "Le mot de passe doit contenir 6 caractères ou plus et n'est pas valide" do
      @user.password = "a" * 5
      @user.valid?
      expect(@user.errors[:password]).to include("Veuillez saisir au moins 6 caractères.")
    end
    
    it "L'adresse e-mail en double doit être invalide" do
      FactoryBot.create(:user)
      @user.valid?
      expect(@user.errors[:email]).to include("Existe déjà.")
    end
  end

  describe "Test des méthodes d'instance" do
    it "Renvoyer le nom complet de l'utilisateur sous forme de chaîne" do
      @user.last_name = "tester"
      @user.first_name = "Taro"
      expect(@user.full_name).to eq "Tester Taro"
    end

    it "Renvoyer le nom canonique de l'utilisateur sous forme de chaîne" do
      @user.kana_last_name = "tester"
      @user.kana_first_name = "Taro"
      expect(@user.kana_full_name).to eq "Tester Taro"
    end
  end

end

"Hmmmm, je vais écrire le code de test dans ce fichier. OK: vulcan: Je ne comprends pas vraiment à partir de la première ligne! ** require'rails_helper '** Qu'est-ce que c'est: hugging:" Ceux qui ont pensé. Cela indique à RSpec qu'une application Rails doit être chargée pour exécuter les tests dans le fichier. Cette description est requise pour presque tous les fichiers de la suite de tests. (Cité de Everyday Rails) Je commence à penser que je n'ai pas besoin d'expliquer quoi que ce soit sur Everyday Rails, mais je ferai de mon mieux.

En bref, en écrivant require'rails_helper ', pour les seniors RSpec ** "Mon application ressemble à ceci! Le modèle a ce type de données, le contrôleur a ce genre de description, et la vue le montre! Comprenez!" ** Je vous le dis. Grâce à cette description, RSpec testera l'application par rapport au code que vous avez écrit.

Alors, quel est ce rails_helper? Ceux qui ont pensé. Les paramètres Rspec peuvent être écrits dans ** rails_helper.rb ** dans le dossier spec. Le paramètre permettant d'utiliser la méthode d'assistance du dispositif dans system_spec, qui sera utilisé dans les spécifications système qui seront décrites la prochaine fois, est également écrit ici.

La partie de ce paramètre, etc. est également décrite dans Rails quotidiens. Je compte vraiment sur Everyday Rails, mais je le recommande car il couvre des informations telles que la description spécifique du code de test et pourquoi cette description est nécessaire.

spec/rails_helper.rb


#concevoir un système de méthode d'aide_Rendre disponible dans les spécifications
  config.include Devise::Test::IntegrationHelpers, type: :system

Je suis sûr qu'il y a des gens qui disent: "Je comprends en quelque sorte rails_helper, mais je ne sais pas si seul le code complet ci-dessous est affiché: hugging:", donc je vais l'expliquer brièvement. Cependant, puisque j'ai écrit plus sur le test du modèle utilisateur dans Everyday Rails, il vaudrait peut-être mieux y faire référence.

Consultez l'exemple de code ci-dessous. Tout d'abord, le bloc before est utilisé pour rendre le code DRY lorsque plusieurs tests dans le même fichier nécessitent les mêmes données. Dans ce cas, les données de test de spec / factories / users.rb décrites dans (2) ci-dessus sont construites et assignées à @user par la description de FactoryBot.build (: user) sur le côté droit. Ce faisant, @user peut être utilisé ultérieurement dans le bloc informatique, etc. Remplacez les données last_name vides par @ user.last_name = "" sur la première ligne du bloc informatique, par exemple "Si @ user.last_name est nul, il est invalide ~" ou @ user.last_name = "a" * En 11, j'ai écrasé les données "aaaaaaaaaaaa" en last_name et j'ai écrit un test tel que "last_name est validé, il est donc invalide sauf s'il contient 10 caractères ou moins." Au fait, le be_valid devant lui s'appelle Matcher. Concernant les matchers, M. Ito's [Introduction à RSpec qui peut être utilisé, partie 2 "Maîtriser les matchers fréquemment utilisés" ](Https://qiita.com/jnchito/items/2e79a1abe7cd8214caa5 "Introduction à RSpec qui peut être utilisé, Partie 2" Maîtriser les correspondants fréquemment utilisés " Je pense que vous devriez vous référer à ").

** Point de trébuchement: étreindre: "Position de description du robot d'usine" ** De plus, en plaçant un bloc avant directement sous RSpec.describe User, tapez :: model do et décrivez @user créé par FactoryBot dedans, @user dans le bloc before est tous dans le même fichier. Il peut être utilisé dans les tests. Cette fois, c'est toujours une simple association, donc c'est mieux, mais à mesure que le nombre d'associations augmente, de plus en plus de données sont créées avec FactoryBot, et je suis accro à la position à décrire à ce moment-là. Surtout System Spec. C'était un marais. J'en parlerai plus tard.

③spec/models/user_spec.rb


RSpec.describe User, type: :model do
#Le bloc before est utilisé pour rendre le code DRY lorsque les mêmes données sont requises pour plusieurs tests dans le même fichier.
 before do
   @user = FactoryBot.build(:user) # @dernier pour l'utilisateur_name{ "tester" }、first_name { "Taro" }Contient des données telles que
 end

 it "Nom, prénom, nom kana, prénom kana, mail, code postal, adresse, numéro de téléphone, le mot de passe doit être valide" do
   expect(@user).to be_valid
 end

 it "Doit être invalide sans nom" do
   @user.last_name = "" # @user.last_Si le nom est nul, il est invalide ~
   @user.valid?
   expect(@user.errors[:last_name]).to include("Entrez s'il vous plait")
 end

 it "Doit être invalide à moins que le nom de famille ne comporte 10 caractères ou moins" do
   @user.last_name = "a" * 11 # last_Puisque le nom est en cours de validation, il n'est pas valide sauf s'il contient 10 caractères ou moins ~
   @user.valid?
   expect(@user.errors[:last_name]).to include("Veuillez saisir moins de 10 caractères")
 end

De plus, seuls les tests suivants semblent un peu différents. FactoryBot.create (: user) est pris en sandwich dans la première ligne. Dans le bloc before mentionné ci-dessus, @user est créé avant le bloc it. Il en va de même pour ce test. Cependant, @user dans le bloc avant cette fois est ** build **, pas create, donc il ne sera pas enregistré dans la base de données à moins qu'il ne soit enregistré. Dans le test suivant, en écrivant FactoryBot.create (: user) dans la première ligne, cela sera sauvegardé avant @user dans le bloc avant dans l'ordre. Après cela, lorsque vous demandez à @ user.valid? (Est-ce que @user est valide?), Les mêmes données sont enregistrées en premier, vous pouvez donc vous attendre à la phrase include ("existe déjà.") Droite.

③spec/models/user_spec.rb


it "L'adresse e-mail en double doit être invalide" do
  FactoryBot.create(:user) #Enregistré en premier
  @user.valid?
  expect(@user.errors[:email]).to include("Existe déjà.")
end

Les autres blocs informatiques ont la même structure et je pense qu'ils peuvent être compris d'une manière ou d'une autre, alors je vais les plier. Veuillez noter que la partie include (veuillez saisir "") de expect peut avoir des déclarations d'erreur différentes selon la personne. Si vous avez traduit l'erreur par i18n en japonais, vérifiez-la avec devise.ja.yml etc., ou vérifiez la déclaration d'erreur du terminal au moment de l'exécution, vérifiez donc chacun et entrez le libellé.


Enfin, testez la méthode. M. Ito a également mentionné dans la vidéo RSpec Beginners qu'il est important de tester la validation du modèle, mais il est également important de tester la méthode, etc. créée par vous-même **. De plus, il semble qu'il ne soit pas nécessaire d'écrire sur le test d'association. (Cependant, si le nom est dupliqué et qu'un pseudo modèle est créé à l'aide de nom_classe, etc. (fonction de suivi, etc.), vous pouvez le faire.) Il y a des parties des associations que Rails fait bien, donc si vous le faites, vous devez vous assurer que la méthode que vous avez créée fonctionne correctement. Certainement j'ai pensé ~ ~ ~. C'est mentionné dans la vidéo, alors jetez un œil. C'est donc super facile, mais j'écrirai également un test de méthode ci-dessous.

③spec/models/user_spec.rb


describe "Test des méthodes d'instance" do
  it "Renvoyer le nom complet de l'utilisateur sous forme de chaîne" do
    @user.last_name = "tester"
    @user.first_name = "Taro"
    expect(@user.full_name).to eq "Tester Taro"
  end

  it "Renvoyer le nom canonique de l'utilisateur sous forme de chaîne" do
    @user.kana_last_name = "tester"
    @user.kana_first_name = "Taro"
    expect(@user.kana_full_name).to eq "Tester Taro"
  end
end

Eh bien, c'est assez facile à comprendre sans aucune explication, donc je ne vais pas l'expliquer. C'est juste que la méthode full_name et la méthode kana_full_name décrites dans le modèle de ① sont correctement des noms complets. Quant aux tests de méthodes, je ne peux rien écrire de compliqué, je vais donc l'étudier. ..

Tester le modèle d'utilisateur d'entreprise

En fait, il existe des associations comme le modèle Relation, mais nous ne les traiterons pas cette fois, nous les avons donc délibérément supprimées. Étant donné que le test pour les utilisateurs d'entreprise est presque le même que pour les utilisateurs individuels, seul le code est décrit, veuillez donc vous référer à ce qui suit.

①company.rb


class Company < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable

  has_many :rooms, dependent: :destroy
  has_many :messages, dependent: :destroy
  has_many :articles, dependent: :destroy
  has_many :notifications, dependent: :destroy

  validates :company_name, presence: true, length: { maximum: 30 }
  validates :kana_company_name, presence: true, length: { maximum: 30 }
  validates :email, presence: true, length: { maximum: 30 }
  validates :postal_code, presence: true, length: { minimum: 7, maximum: 7 }
  validates :address, presence: true, length: { maximum: 30 }
  validates :phone_number, presence: true, length: { maximum: 12 }
  validates :introduction, length: { maximum: 800 }

  attachment :profile_image
  attachment :background_image

  #Si approuvé est vrai, vous pouvez vous connecter. Au moment du nouvel enregistrement, la valeur par défaut est false, vous ne pouvez donc pas vous connecter
  def active_for_authentication?
    super && self.approved?
  end

  #Le message après la connexion est retourné ci-dessus. Les détails du libellé sont config/locales/devise.ja.Décrit en yml.
  def inactive_message
    self.approved? ? super : :needs_admin_approval
  end

  def followed_by?(user)
    passive_relationships.find_by(following_id: user.id).present?
  end
end

②spec/factories/companies.rb


FactoryBot.define do
  factory :company do
    company_name { "Test Co., Ltd." }
    kana_company_name { "Test Co., Ltd." }
    email { "[email protected]" }
    postal_code { "1234567" }
    address { "123, Chiyoda-ku, Tokyo-12-1" }
    phone_number { "12345678910" }
    password { "testcompany" }
    approved { true }
    is_active { true }
  end
end

③spec/models/company_spec.rb


require 'rails_helper'

RSpec.describe Company, type: :model do

  describe "Test de validation" do

    before do
      @company = FactoryBot.build(:company)
    end

    it "Si vous avez le nom de l'entreprise, le nom kana de l'entreprise, l'adresse e-mail, le code postal, l'adresse, le numéro de téléphone et le mot de passe, ils doivent être valides." do
      expect(@company).to be_valid
    end

    it "Il n'est pas valide sans le nom de l'entreprise" do
      @company.company_name = ""
      @company.valid?
      expect(@company.errors[:company_name]).to include("Entrez s'il vous plait")
    end

    it "Il n'est pas valide s'il n'y a pas de nom kana de société" do
      @company.kana_company_name = ""
      @company.valid?
      expect(@company.errors[:kana_company_name]).to include("Entrez s'il vous plait")
    end
    
    it "Doit être invalide sans adresse e-mail" do
      @company.email = ""
      @company.valid?
      expect(@company.errors[:email]).to include("Entrez s'il vous plait")
    end
    
    it "S'il n'y a pas de code postal, il est invalide" do
      @company.postal_code = ""
      @company.valid?
      expect(@company.errors[:postal_code]).to include("Entrez s'il vous plait")
    end
    
    it "S'il n'y a pas d'adresse, c'est invalide" do
      @company.address = ""
      @company.valid?
      expect(@company.errors[:address]).to include("Entrez s'il vous plait")
    end
    
    it "S'il n'y a pas de numéro de téléphone, il n'est pas valide" do
      @company.phone_number = ""
      @company.valid?
      expect(@company.errors[:phone_number]).to include("Entrez s'il vous plait")
    end

    it "Le mot de passe doit contenir 6 caractères ou plus et n'est pas valide" do
      @company.password = "a" * 5
      @company.valid?
      expect(@company.errors[:password]).to include("Veuillez saisir au moins 6 caractères")
    end
    
    it "L'adresse e-mail en double doit être invalide" do
      FactoryBot.create(:company)
      @company.valid?
      expect(@company.errors[:email]).to include("Existe déjà")
    end
    
  end
end

Test du modèle de genre

Le genre n'est pas particulièrement difficile, je vais donc omettre l'explication.

①genre.rb


class Genre < ApplicationRecord
  has_many :articles, dependent: :destroy
  validates :genre_name, presence: true, length: { maximum: 15 }
end

②spec/factories/genres.rb


FactoryBot.define do
  factory :genre do
    genre_name { "Genre de test" }
    is_active { true }
  end
end

③spec/models/genre_spec.rb


require 'rails_helper'

RSpec.describe Genre, type: :model do
  describe "Test de validation" do
    it "S'il n'y a pas de nom de genre, il n'est pas valide" do
      @genre = FactoryBot.build(:genre)
      @genre.genre_name = ""
      @genre.valid?
      expect(@genre.errors[:genre_name]).to include("Entrez s'il vous plait")
    end
  end
end

Test du modèle d'article

① Introduction du modèle d'article

Je suis enfin là. Les spécifications du modèle dans l'article sont légèrement différentes, je voudrais donc les expliquer brièvement. Voici le modèle d'article.

①article.rb


class Article < ApplicationRecord
  belongs_to :company
  belongs_to :genre

  validates :title, presence: true, length: { maximum: 35 }
  validates :body, presence: true

  attachment :image

  #Rechercher uniquement les articles avec un statut de publication valide et des genres valides
  def self.all_active
    where(is_active: true).joins(:genre).where(genres: {is_active: true})
  end

  def favorited_by?(user)
    favorites.where(user_id: user.id).exists?
  end
end

② Utilisez FactoryBot et préparez les données d'article à l'avance.

②spec/factories/articles.rb


FactoryBot.define do
  factory :article do
    title { "Titre du test" }
    body { "Corps de test" }
    is_active { true }
    company
    genre
  end
end

③ Description du test spécifique

J'écrirai un test du modèle d'article. $ bin / rails g rspec: model article crée article_spec.rb dans le dossier spec / models. Voici un exemple du code complété.

③spec/models/article_spec.rb


require 'rails_helper'

RSpec.describe Article, type: :model do

  describe "Test d'article" do
    before do
      @company = FactoryBot.create(:company)
      @genre = FactoryBot.create(:genre)
      @article = FactoryBot.build(:article)
    end

    #création d'article
    context "Lorsque toutes les données sont incluses" do
      it "Tous sont entrés pour qu'il soit sauvegardé" do
        @article.company_id = @company.id
        @article.genre_id = @genre.id
        expect(@article.save).to be true
      end
    end

    context "Lorsque toutes les données ne sont pas incluses" do
      it "Non enregistré car tous n'ont pas été saisis" do
        @article.company_id = @company.id
        @article.genre_id = @genre.id
        @article.title = ""
        @article.body = ""
        expect(@article.save).to be false
      end
    end
  end

  describe "Test de validation" do
    before do
      @article = FactoryBot.build(:article)
    end

    context "Si le titre n'existe pas" do
      it "Être dans un état invalide" do
        @article.title = ""
        @article.valid?
        expect(@article.errors[:title]).to include("Entrez s'il vous plait")
      end
    end

    context "Si le titre dépasse 35 caractères" do
      it "Je reçois un message d'erreur" do
        @article.title = "a" * 36
        @article.valid?
        expect(@article.errors[:title]).to include("Veuillez saisir moins de 35 caractères")
      end
    end

    it "S'il n'y a pas de texte, il est invalide" do
      @article.body = ""
      @article.valid?
      expect(@article.errors[:body]).to include("Entrez s'il vous plait")
    end
    
  end
end

Eh bien, il n'y a rien de nouveau jusqu'à présent, mais le modèle d'article est tel que décrit dans ① belongs_to :company belongs_to :genre C'est une association comme celle-là, et c'est un peu différent d'avant. Comme indiqué ci-dessous, dans le bloc précédent, la société et le genre sont d'abord créés avec FactoryBot, enregistrés dans la base de données, puis affectés respectivement à @company et @genre. Le flux de publication d'articles Il y a une entreprise → Sélectionnez un genre d'article → Vous pouvez publier un article C'est devenu un flux. Sur cette base, le bloc avant a la description suivante car ** les sociétés et les genres doivent exister ** pour publier des articles.

Le reste est facile.

  1. Quelle entreprise a publié l'article, 2. Quel genre d'article Remplacez respectivement @ article.company_id et @ article.genre_id.
  2. Si toutes les données sont incluses, 2. Si toutes les données ne sont pas incluses, testez simplement séparément par contexte!

③spec/models/article_spec.rb


RSpec.describe Article, type: :model do

  describe "Test d'article" do
    before do
      #Il y a une entreprise → Sélectionnez un genre d'article → Vous pouvez publier un article
      @company = FactoryBot.create(:company)
      @genre = FactoryBot.create(:genre)
      @article = FactoryBot.build(:article)
    end

    #création d'article
    context "Lorsque toutes les données sont incluses" do
      it "Tous sont entrés pour qu'il soit sauvegardé" do
        @article.company_id = @company.id
        @article.genre_id = @genre.id
        expect(@article.save).to be true
      end
    end

    context "Lorsque toutes les données ne sont pas incluses" do
      it "Non enregistré car tous n'ont pas été saisis" do
        @article.company_id = @company.id
        @article.genre_id = @genre.id
        @article.title = ""
        @article.body = ""
        expect(@article.save).to be false
      end
    end
  end

Ceci termine le test du modèle! Il existe également une spécification de modèle du modèle de message, mais je vais l'omettre car le nombre d'éléments est petit. Si vous êtes intéressé, veuillez consulter GitHub.

À la fin

Cette fois, nous avons résumé les tests et les spécifications du modèle, qui sont les parties essentielles de l'application. Les spécifications du modèle sont également importantes, mais les plus importantes seront les spécifications du système décrites la prochaine fois. Testez le comportement dans un vrai navigateur, comme un utilisateur modifiant ma page ou envoyant un DM à une entreprise. Il y avait de nombreux points à trébucher. Peut-être que je suis le seul à penser: Je voudrais le résumer de manière facile à comprendre, alors j'espère que vous le reverrez la prochaine fois. Merci d'avoir regardé jusqu'à la fin.

** L'édition des spécifications du système 2020.09.28 a été publiée. Veuillez voir ici. ** **

Article de référence

https://qiita.com/jnchito/items/2a5d3e15761fd413657a https://qiita.com/jnchito/items/42193d066bd61c740612 https://qiita.com/jnchito/items/2e79a1abe7cd8214caa5

Recommended Posts

[1er] RSpec débutant a essayé d'écrire ModelSpec en tant que débutant
[3e] Les débutants de RSpec ont écrit SystemSpec en tant que débutant (édition finale)
[2e] RSpec débutant a écrit SystemSpec en tant que débutant (édition Numa)
Les débutants de Rails ont essayé de se lancer avec RSpec
Pour écrire un programme orienté utilisateur (1)
J'ai essayé d'écrire du code comme une déclaration de type en Ruby
[R Spec on Rails] Comment écrire du code de test pour les débutants par les débutants
Un débutant Java a essayé de créer une application Web simple à l'aide de Spring Boot
Je veux écrire un joli build.gradle
[Basique] Comment écrire un auto-apprentissage Dockerfile ②
[Introduction à Java] Comment écrire un programme Java
Je veux écrire un test unitaire!
[Java] Les débutants veulent faire des rencontres. 1er
[SpringBoot] Comment écrire un test de contrôleur
Les débutants rapides ont essayé d'implémenter la logique micro-ondes!
Considérez RxJava comme une bibliothèque qui facilite l'écriture du traitement asynchrone
[Azure] J'ai essayé de créer une application Java pour la création d'applications Web gratuites - [Débutant]
Lors de la définition d'une classe, écrivez formatTo ainsi que toString (comment utiliser Formattable)