[RUBY] [Rails] De la préparation du test au test unitaire du modèle [RSpec]

introduction

J'écrirai sur les tests de Rails. Il s'agit d'un test unitaire du modèle utilisant RSpec. L'essentiel est de vérifier si la validation fonctionne bien.

Présentation de RSpec

Tout d'abord, installez la gemme. Modifiez le Gemfile et installez le bundle.

Gemfile


group :development, :test do
  gem 'rspec-rails'
end

# web-Si la gemme appelée console se trouve dans l'environnement de test, déplacez-la uniquement vers le développement
group :development do
  gem 'web-console'
end

Terminal


$ bundle install

Ensuite, préparez un fichier pour rspec.

Terminal


$ rails g rspec:install

Je pense que vous avez ajouté quelques fichiers.

Ajoutez ce qui suit au .rspec du fichier ajouté.

.rspec


--format documentation

Ensuite, préparez les répertoires nécessaires.

Créez un répertoire spec / models

Ensuite, créez un fichier pour écrire le code de test dans le répertoire models. Cette fois, nous allons créer post_spec.rb. Nommons le fichier model name_spec.rb.

Maintenant, vous êtes prêt à partir.

Description du code de test

Écrivons le code de test.

spec/models/post_spec.rb


require 'rails_helper' # rails_Requis pour utiliser helper. Veuillez écrire sans réfléchir
describe Post do #À propos du modèle de poste
  describe '#create' do #À propos de l'action de création
    it "Impossible de s'inscrire s'il n'y a pas de contenu" do #Décrivez le contenu de confirmation du test
      post = Post.new(content: "") #Créer une instance (données) du modèle Post
      post.valid? #Lors de l'enregistrement d'une instance, assurez-vous qu'elle ne peut pas être enregistrée en raison de la validation.
      expect(post.errors[:content]).to include("can't be blank") #Dans la déclaration d'erreur"can't be blank"Déterminer si est inclus
    end
  end
end

Chaque processus est comme je l'ai écrit dans le commentaire, mais si vous le vérifiez un par un sur la console, vous pouvez le comprendre un peu plus, alors essayons-le! Lançons l'écran de la console dans le terminal.

Terminal


$ rails c

Essayez d'exécuter le code de test «it ~ end» dans l'ordre.

ff85d977fcb5b51a8144d55c95468715.png [1] Ici, une instance du modèle Post (colonne de contenu vide) est créée. 3ce62d1bbec5ec9557a79f44cbc6ab93.png [2] Si l'instance créée ci-dessus ne parvient pas à enregistrer, false sera retourné. Pour plus d'informations sur les méthodes valides et non valides, veuillez consulter [ici](https://railsguides.jp/active_record_validations.html#valid-questionmark% E3% 81% A8 invalid-questionmark). 67d49b9cce2dfa00427194114ba6a853.png [3] La déclaration d'erreur peut être visualisée en utilisant la méthode des erreurs. Je reçois un message d'erreur à l'adresse `@ message`. Cette fois, en plus de la validation qui n'autorise pas d'espace vide, le modèle Post a également une validation d'au moins 2 caractères, donc ces deux erreurs se produisent.

Outil utile (FactoryBot)

Le modèle Post utilisé dans l'exemple ci-dessus comportait peu de colonnes et il était facile de créer des données de test. Cependant, avec un modèle utilisateur qui contient plusieurs éléments d'information tels que le nom, l'adresse e-mail et le mot de passe, il est difficile d'écrire les données une par une.

user = User.new(name: "hoge", email: "[email protected]", password: "xxxxxx")

Vous devez l'écrire de cette façon, ce qui entraîne un code redondant.

Si vous utilisez une gemme appelée ** FactoryBot **, vous pouvez préparer les données par défaut et modifier les données uniquement là où vous en avez besoin, ce qui est pratique. J'écrirai la méthode d'introduction et l'utilisation dans l'ordre.

Insérez d'abord la gemme.

Gemfile


group :development, :test do
  #réduction
  gem 'factory_bot_rails'
end

Terminal


$ bundle install

Créez un répertoire spec / factories.

Ensuite, créez un fichier pour écrire les données dans le répertoire des usines. Cette fois, je vais créer ʻusers.rb. Appelons le fichier nom du modèle au pluriel .rb`. La façon d'écrire est la suivante.

spec/factories/users.rb


FactoryBot.define do

  factory :user do
    nickname              {"neko"}
    email                 {"[email protected]"}
    password              {"nyannyan"}
    password_confirmation {"nyannyan"}
    profile               {"hello"}
  end

end

Vous pouvez facilement créer une instance avec un fichier de spécification en utilisant factory_bot.

user_spec.rb


user = FactoryBot.create(:user)

Écrivez simplement et cela créera une instance préparée dans users.rb.

En fait, c'est un peu plus facile à écrire, alors définissons-le également.

Omission de la notation factory_bot Ajoutez ce qui suit à rails_helper.

rails_helper.rb


RSpec.configure do |config|
  #Ajoutez ce qui suit
  config.include FactoryBot::Syntax::Methods
  # (réduction)
end

Utilisons ceci pour écrire un test pour le modèle User, par exemple.

user_spec.rb


require 'rails_helper'

describe User do
  describe '#create' do

    it "Impossible de s'inscrire sans pseudo" do
      user = build(:user, nickname: "")
      user.valid?
      expect(user.errors[:nickname]).to include("Entrez s'il vous plait")
    end

    it "Impossible de s'inscrire sans e-mail" do
      user = build(:user, email: "")
      user.valid?
      expect(user.errors[:email]).to include("Entrez s'il vous plait")
    end

  end
end

Vous pouvez créer une instance en faisant build (: nom du modèle) comme ceci. Si vous souhaitez utiliser une valeur différente de la valeur préparée par factory_bot, comme des données vides, vous pouvez utiliser build (: nom du modèle, nom de la colonne: valeur).

Lancer le test

Tout ce que vous avez à faire est d'entrer une commande depuis le terminal pour exécuter le test.

Terminal


$ bundle exec rspec  
fd3dba157c0da00633c15f6a630b06f2.png Si le test réussit, il sera affiché comme ceci. En cas d'échec, le nombre de feilures est compté par le nombre de tests qui n'ont pas réussi, et le contenu de l'erreur est affiché.

Exécuter le test en spécifiant le fichier

La commande bundle exec rspec écrite ci-dessus exécutera tout le fichier de spécification, donc si vous avez déjà un test vérifié, ce sera un peu inutile.

Terminal


$ bundle exec rspec spec/Nom du répertoire/nom de fichier(_spec.rb)

Vous pouvez spécifier le fichier et l'exécuter par. En prenant le test du modèle utilisateur utilisé cette fois à titre d'exemple, il se présente comme suit.

Terminal


$ bundle exec rspec spec/models/user_spec.rb

Recommended Posts

[Rails] De la préparation du test au test unitaire du modèle [RSpec]
[Rspec] Flux de l'introduction de Rspec à l'écriture du code de test unitaire pour le modèle
[Rails5] Rspec -Test d'unité lors de l'imbrication-
À propos du test d'application RSpec (test unitaire)
[rails] Faisons un test unitaire avec Rspec!
[Rails] Code de test unitaire pour le modèle utilisateur
[Ruby on Rails] Test de modèle avec RSpec
[Rails] Test avec RSpec
[Rails / RSpec] Ecrire un test de modèle (avec Shoulda Matchers / FactoryBot)
Introduction à Micronaut 2 ~ Test unitaire ~
[Rails] Code de test à l'aide de Rspec
[Rails] À propos du test de réponse Rspec
J'ai essayé un test unitaire de l'application Rails en utilisant RSpec et FactoryBot
[Rails] Test d'intégration avec Capybara (de l'introduction à l'exécution simple du test)
[Challenge CircleCI from 0] Construire un test automatisé (Rails6.0, mysql8.0, Rspec)
Comment faire un test unitaire de Spring AOP
[R Spec on Rails] Comment écrire du code de test pour les débutants par les débutants
Remarques sur la génération de données factices pour les mots de passe dans le code de test unitaire du modèle Rails
[RSpec] Test unitaire (avec gem: factory_bot)
De la traction des rails image-docker au lancement
Introduire RSpec et écrire le code de test unitaire
[Ruby on Rails] Afficher le test avec RSpec
[Rails] Comment convertir ERB en Haml
Bibliothèque de tests unitaires Java Artery-Easy to use
Je veux écrire un test unitaire!
[Ruby on Rails] Test du contrôleur avec RSpec
[Rails] Assignation de variables du contrôleur à JavaScript
Quel est le test de code de test de modèle
Après l'introduction de RSpec, jusqu'à ce que vous commenciez à écrire le code de test unitaire pour le modèle
[Rails] Je veux tester avec RSpec. Nous soutenons votre démarche [Procédure d'introduction]
[Rails] J'ai essayé de faire passer la version de Rails de 5.0 à 5.2
Comment lier Rails6 Vue (à partir de la construction de l'environnement)
Tutoriel Rails Chapitre 1 De zéro au déploiement [Essayer]
[Rails] Comment implémenter un test unitaire d'un modèle
Présentation de Rspec, un framework de test pour Ruby on Rails
Je veux jouer avec Firestore de Rails
Les débutants de Rails ont essayé de se lancer avec RSpec
[Rails] Introduction de pay.jp (de la personnalisation de la vue à l'enregistrement)