[Ruby on Rails] Test de modèle avec RSpec

Environnement de développement

ruby 2.5.7 Rails 5.2.4.3 OS: macOS Catalina

supposition

[Ruby on Rails] Jusqu'à l'introduction de RSpec Nous partirons du principe que cela est fait.

Préparation du test de modèle

・ Paramètres de validation

Cette fois, nous allons tester s'il existe une colonne de titre et le nombre de caractères.

app/models/post.rb


class Post < ApplicationRecord
  belongs_to :user
  validates :title, presence: true, length: {maximum: 20}
end

・ Création d'un fichier

① Créer un dossier de modèles et un dossier d'usines selon les spécifications, Créez également un fichier pour le modèle que vous souhaitez tester. Cette fois, nous allons tester le modèle de poste. De plus, pour garantir que les utilisateurs ne peuvent publier que lorsqu'ils sont connectés, Créez également un modèle d'utilisation. La structure des fichiers est la suivante.   spec/models/post_spec.rb → Décrivez ce que vous voulez tester

spec/factories/post.rb spec/factories/user.rb → Créer des données factices

② Vous permet d'utiliser FactoryBot. Il est pratique de l'utiliser car vous pouvez enregistrer la base de données et créer le modèle comme user = create (: user). Créez un dossier de support et un fichier factory_bot.rb sous spec et décrivez comme suit.

spec/support/factory_bot.rb


RSpec.configure do |config|
  config.include FactoryBot::Syntax::Methods
end

Ajoutez ensuite ce qui suit:

spec/rails_helper.rb


# This file is copied to spec/ when you run 'rails generate rspec:install'
require 'spec_helper'
ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../config/environment', __dir__)
# Prevent database truncation if the environment is production
abort("The Rails environment is running in production mode!") if Rails.env.production?
require 'rspec/rails'
require 'support/factory_bot' #<-Ajout

...

Code réel

Tout d'abord, créez des données factices.

spec/factories/user.rb


FactoryBot.define do
  factory :user do
    email { Faker::Internet.email }
    phone_number { 12345678909 }
    password { 'password' }
    password_confirmation { 'password' }
  end
end

spec/factories/post.rb


FactoryBot.define do
  factory :post do
    body { Faker::Lorem.characters(number:20) }
    user
  end
end

Ensuite, écrivez le code de test.

spec/models/post_spec.rb


require 'rails_helper'

RSpec.describe 'Test post-modèle', type: :model do
  describe 'Test de validation' do
    #Utilisez les données factices créées par les usines.
    let(:user) { FactoryBot.create(:user) }
    let!(:post) { build(:post, user_id: user.id) }

    # test_Créez un message et vérifiez si vous pouvez vous inscrire dans le vide.
    subject { test_post.valid? }
    let(:test_post) { post }


    context 'colonne de titre' do
      it 'Ne doit pas être vide' do
        test_post.title = ''
        is_expected.to eq false;
      end
      it 'Doit contenir 20 caractères ou moins' do
        post.title = Faker::Lorem.characters(number:21)
        expect(post.valid?).to eq false;
      end
    end
  end
  describe 'Associations de test' do
    context 'Relation avec le modèle client' do
      it 'N:Est 1' do
        expect(Post.reflect_on_association(:user).macro).to eq :belongs_to
      end
    end

    # has_Il est également décrit par de nombreuses relations.
    # context 'Relation avec le modèle PostComment' do
      # it '1:Est N' do
        # expect(Post.reflect_on_association(:post_comments).macro).to eq :has_many
      # end
    # end
  end
end

Ensuite, procédez comme suit dans votre terminal:

$ rspec spec/models

Si vous réussissez le test

Finished in 0.52408 seconds (files took 2.11 seconds to load)
3 examples, 0 failures

Comme il est affiché comme ceci, cela signifie que le contenu du test est correct.

Au contraire, s'il ne réussit pas le test, vous pouvez voir où l'erreur se produit de cette manière, donc Vous pourrez voir si le code de test est erroné, la validation est fausse, et ainsi de suite.

Failures:

  1)Post-test du modèle Colonne du titre du test de validation Doit contenir 20 caractères maximum
     Failure/Error: let!(:post) { build(:post) }
     
     NoMethodError:
       undefined method `build' for #<RSpec::ExampleGroups::Post::Nested::Title:0x000000000619e938>
     # ./spec/models/post_spec.rb:9:in `block (3 levels) in <top (required)>'

  2)Post-test du modèle Colonne du titre du test de validation Ne doit pas être vide
     Failure/Error: let!(:post) { build(:post) }
     
     NoMethodError:
       undefined method `build' for #<RSpec::ExampleGroups::Post::Nested::Title:0x0000000007491518>
     # ./spec/models/post_spec.rb:9:in `block (3 levels) in <top (required)>'
Finished in 0.07992 seconds (files took 2.41 seconds to load)
2 examples, 2 failures

Failed examples:

rspec ./spec/models/post_spec.rb:11 #Post-test du modèle Colonne du titre du test de validation Doit contenir 20 caractères maximum
rspec ./spec/models/post_spec.rb:15 #Post-test du modèle Colonne du titre du test de validation Ne doit pas être vide

De plus, en utilisant rspec ./spec/models/post_spec.rb:11 en bas, Vous pouvez également vérifier le contenu du test individuellement comme indiqué ci-dessous.

Terminal


$ rspec spec/models/post_spec.rb:11

Résumé

Cette fois 1, validation pour empêcher l'enregistrement avec présence vide: vrai 2, validation de la longueur limite des caractères: {maximum: 20} 3, confirmation de la relation de relation appartient_to: utilisateur

J'ai testé ce qui précède, mais il existe de nombreuses autres méthodes de test, donc Si vous êtes intéressé, veuillez le vérifier.

De plus, sur Twitter, les technologies et les idées qui n'ont pas été téléchargées sur Qiita sont également téléchargées, donc Je vous serais reconnaissant si vous pouviez me suivre. Cliquez ici pour plus de détails https://twitter.com/japwork

Recommended Posts

[Ruby on Rails] Test de modèle avec RSpec
[Ruby on Rails] Afficher le test avec RSpec
[Ruby on Rails] Test du contrôleur avec RSpec
[Rails] Test avec RSpec
Présentation de Rspec avec Ruby on Rails x Docker
Comprendre la couverture du code avec Rspec, le framework de test Ruby on Rails
Présentation de Rspec, un framework de test pour Ruby on Rails
Exécutez des tests Ruby on Rails RSpec avec des actions GitHub
[rails] Faisons un test unitaire avec Rspec!
[Ruby on Rails] 1 modèle CRUD (routage principal)
Modèle [Ruby on Rails], commande de terminal de contrôleur
Remarques sur l'utilisation de FCM avec Ruby on Rails
Ruby on Rails élémentaire
Principes de base de Ruby on Rails
Testez Nokogiri avec Rspec.
Association Ruby On Rails
[Ruby on Rails] Jusqu'à l'introduction de RSpec
Publiez l'application avec ruby on rails
[Rails] Procédure de liaison de bases de données avec Ruby On Rails
Déterminez la page actuelle avec Ruby on Rails
[Ruby on Rails] Téléversement de plusieurs images avec refile
J'ai fait un portfolio avec Ruby On Rails
[Rails] De la préparation du test au test unitaire du modèle [RSpec]
Création de portfolio Ruby on Rails
Record d'apprentissage Ruby on rails -2020.10.04
[Ruby on Rails] Supprimer les images s3 avec Active Strage
[Ruby on Rails] Debuck (binding.pry)
Record d'apprentissage de Ruby on rails -2020.10.05
[Rails / RSpec] Ecrire un test de modèle (avec Shoulda Matchers / FactoryBot)
Tester Active Strage avec RSpec
Record d'apprentissage Ruby on rails-2020.10.07 ②
[Ruby On Rails] Erreur de test utilisant le client RSpec MySQL n'est pas connecté
Tester le résolveur GraphQL avec rspec
Record d'apprentissage Ruby on rails-2020.10.07 ①
Annuler la migration de Ruby on Rails
[Rails] À propos du test de réponse Rspec
Record d'apprentissage de Ruby on rails -2020.10.06
Résumé de la validation Ruby on Rails
[Ruby on Rails] Fonction de recherche (modèle, formule de sélection de méthode)
Création d'un plan de site au format RSS / Atom avec Ruby on Rails
Mémorandum de base Ruby on Rails
J'ai essayé d'installer le plugin lié à Ruby on Rails avec vim-plug
[Ruby on Rails] Ajouter une colonne avec des contraintes de clé externe
[Ruby on Rails] Élimination de Fat Controller-First, logic to model-
[Ruby on Rails] Implémenter la fonction de connexion par add_token_to_users avec l'API
[Ruby On Rails] Lors de l'exécution d'un test d'unité de modèle avec RSpec à l'aide de FactoryBot, une erreur se produit car la clé externe n'est pas saisie.
Installez Ruby sur MSYS2 avec pacman
[Ruby on Rails] Read try (: [] ,: key)
Installation de Ruby + Rails sur Ubuntu 18.04 (rbenv)
[Ruby on Rails] Introduction de la fonction de pagination
Connaissance de base de Ruby on Rails
Progatez Ruby on Rails