[RUBY] [Rails] Test avec RSpec

introduction

Des tests que j'ai évités car je pensais que ce serait difficile. Je suis sur le point de démarrer le service pour de bon, alors j'écrirai ce que j'ai appris comme première étape pour bien comprendre le test. C'est un soi-disant mémorandum. Puisque je suis moi-même un débutant, j'écrirai du point de vue d'un débutant. Je vous serais reconnaissant si vous pouviez commenter s'il existe plus de styles et de méthodes d'écriture comme celui-ci!

Introduction de RSpec

Nous présenterons les règles. Eh bien, sans penser à rien ici

Gemfile


group :development, :test do
  ...réduction...
  gem 'rspec-rails'
end

group :development do
  gem 'web-console' #Il peut avoir été répertorié à l'origine.
end


Après avoir édité le Gemfile, effectuez l'installation habituelle du bundle.

Paramètres de base RSpec

Tout d'abord, vous devez créer un fichier de configuration pour RSpec. Au terminal

$ rails g rspec:install

Ensuite, le fichier suivant sera généré.

      create  .rspec
      create  spec
      create  spec/spec_helper.rb
      create  spec/rails_helper.rb

Ajoutez ce qui suit au fichier ***. Rspec *** des fichiers générés.

.rspec


--format documentation

Si vous ajoutez ce qui précède, le résultat du test sera affiché de manière facile à lire. Vous pouvez le considérer comme l'écriture du contexte et cela sortira plus tard par étapes. Eh bien, je ne pense pas que ce soit un problème sans cela. À propos, si vous ajoutez des options autres que celles ci-dessus, vous pouvez également générer du texte et l'afficher en parallèle, donc si vous voulez l'avoir, veuillez le vérifier.

Pour le moment, l'installation est terminée. C'est le travail d'écrire le code de test à partir d'ici.

Essayez d'exécuter le test

RSpec peut être exécuté en tapant une commande dans le terminal. Je n'ai pas encore écrit de code de test, mais je vais taper le code suivant dans le terminal pour voir s'il fonctionne réellement.

Terminal


$ bundle exec rspec

Ce qui précède est la commande pour exécuter le test. Par conséquent, ce n'est pas grave si l'affichage ci-dessous est affiché.

Terminal


No examples found.


Finished in 0.00031 seconds (files took 0.19956 seconds to load)
0 examples, 0 failures

À partir de là, créez des fichiers de test tels que des modèles, des contrôleurs, des racines et des vues, et écrivez du code de test.

Test unitaire (modèle)

L'objectif est d'écrire et d'exécuter du code de test pour la validation du modèle, qui est un test unitaire.

Ce que vous devez savoir à l'avance

Le code de test crée un fichier de spécification et l'écrit. Au lieu de créer et d'écrire un fichier, placez le fichier de spécification sous spec / models / pour le fichier de test du modèle et sous spec / controllers / pour le fichier de test du contrôleur pour une compréhension facile. Je vais.

*** convention de dénomination des fichiers de spécifications *** Le fichier de spécification sera nommé le nom de classe correspondant_spec.rb. Cette fois, nous allons tester la validation du formulaire de contact (contact model / contact.rb), donc le nom sera "contact_spec.rb".

Bases du code de test

Maintenant que vous connaissez le fichier pour écrire le code de test, écrivez le code de test super super basique avant de l'écrire. *** Code de test simple "Assurez-vous que 1 + 1 devient 2" ***

sample_spec.rb


describe "hogehoge" do
  it "1 +1 devient 2" do
    expect(1 + 1).to eq 2
  end
end

Ignorez le vocabulaire et donnez mon propre commentaire.

sample_spec.rb



describe "hogehoge" do        #describe(Signification d'expliquer)Créez un groupe pour ce test.
  it "1 +1 devient 2" do     #it "~~~"faire~~~Écrivez le test que ce code fait dans la pièce
    expect(1 + 1).to eq 2     #Cette partie est la formule qui vérifie si le test réussit réellement.
  end
end

La formule ci-dessus expect (1 + 1) .to eq 2 part est appelée expectation. ● expect(X).to eq Y  Si la valeur de l'expression dans la partie x est égale à la valeur de la partie Y comme ceci, le test réussira. La partie eq s'appelle le matcher.

Un matcher est une condition dans laquelle un test réussit dans une spéculation. Par exemple, comme mentionné ci-dessus, eq signifie «si égal». Il existe plusieurs autres correspondances telles que include (si elles sont incluses) et valides (si elles sont validées). Il y en a beaucoup, veuillez donc l'utiliser en fonction du test que vous souhaitez rédiger.

Testez en fait la validation du modèle.

Le modèle de contact (fonction d'interrogation) utilisé cette fois est le suivant.

contact.rb



class Contact < ApplicationRecord

#Nom de l'expéditeur
  validates :name, presence: true 

#Mead pour répondre aux demandes de renseignements
  validates :email, presence: true, length: {maximum:255},
                                    format: {with: /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i}

#Sujet de l'enquête
  validates :title, presence: true

#Contenu de la demande
  validates :message, presence: true
end

Nous écrirons le code de test pour la validation ci-dessus.

Créez un fichier spec / models / contact_spec.rb.

Modifiez le contact_spec.rb créé comme suit.

contact_spec.rb


require 'rails_helper'
  RSpec.describe Contact, type: :model do
    it "Impossible de s'inscrire sans nom" do
  end
end

La première ligne require'rails_helper 'active les paramètres communs en lisant la description dans rails_helper.rb. Cette description de première ligne est écrite à chaque fois dans chaque fichier de spécifications.

Une fois que je l'ai écrit, exécutez la commande bundle exec rspec dans le terminal. Je n'ai pas encore écrit d'expression qui s'évalue comme un test, donc le test passe sans condition. Ce n'est pas grave si cela ressemble à ce qui suit.

Terminal

Terminal


Contact
Impossible de s'inscrire sans nom

Finished in 0.23784 seconds (files took 4.71 seconds to load)
1 example, 0 failures

Écrivez le code de test pour vous assurer que vous ne pouvez pas vous inscrire si le nom est vide

Ajoutez ce qui suit au code de test que vous avez écrit précédemment.

contact_spec.rb



RSpec.describe Contact, type: :model do
  it "Impossible de s'inscrire sans nom" do
    contact = Contact.new(name: "", email: "[email protected]", title: "À propos des retours", message: "Je souhaite retourner l'article portant le numéro de commande 000000000.")
    contact.valid?
    expect(contact.errors[:name]).to include("Entrez s'il vous plait")
  end
end

*** [3e ligne] Créez une nouvelle instance de classe de contact avec la propriété que vous souhaitez tester ***. Puisque je veux créer un code de test pour confirmer que "ne peut pas être enregistré si le nom est vide", je crée une instance de classe de contact avec la valeur de nom vide et d'autres valeurs définies de manière appropriée.

*** [6ème ligne] Vérifiez si l'instance créée en *** ne peut pas être sauvegardée par validation.

Après avoir vérifié avec *** [7ème ligne] ***, vérifiez si l'instruction d'erreur de l'instance correspond à ce que vous attendiez. Si vous spécifiez le nom de la colonne dans la méthode de récupération de la valeur du hachage pour contact.errors, vous pouvez récupérer le tableau contenant l'instruction d'erreur provoquée par cette colonne. Pour cela, nous créons une exemption à l'aide d'un matcher appelé include. Cette fois, "Veuillez saisir" est affiché dans la déclaration d'erreur de validation, le contenu est donc décrit.

Le flux ci-dessus a la même signification que la vérification sur la console ci-dessous.

Terminal



#Lancez la console
$ rails c
#Créer une instance de la classe de contact avec une valeur de nom vide
>contact = Contact.new(name: "", email: "[email protected]", title: "À propos des retours", message: "Je souhaite retourner l'article portant le numéro de commande 000000000.")
#valid?Utilisez la méthode
>contact.valid?
#Utilisez la méthode des erreurs
>contact.errors
=> #<ActiveModel::Errors:0x007ffa6ce07ef0
 @base=
  #<Contact:0x007ffa6d3430b8
#Omission
 @messages={:name=>["Entrez s'il vous plait"]}>

Entrez maintenant la commande RSpec pour exécuter le test.

Terminal


$ bundle exec rspec

Si vous obtenez le résultat suivant, vous réussissez.

Terminal


Contact
Impossible de s'inscrire sans nom

Finished in 0.07346 seconds (files took 2.31 seconds to load)
1 example, 0 failures

Si une erreur est affichée, un message d'erreur s'affiche dans le terminal et peut souvent être résolu en le lisant attentivement. De plus, comme mentionné ci-dessus, si vous le vérifiez une fois comme une série de flux sur la console, je sens que votre compréhension s'approfondira un peu.

[Pour être efficace] Présentation de factory_bot

J'ai écrit un code de test plus tôt, mais lors de l'écriture d'un test de courrier autre que le nom, ce sera comme suit.

contact_spec.rb



RSpec.describe Contact, type: :model do
  it "Impossible de s'inscrire sans nom" do
    contact = Contact.new(name: "", email: "[email protected]", title: "À propos des retours", message: "Je souhaite retourner l'article portant le numéro de commande 000000000.")
    contact.valid?
    expect(contact.errors[:name]).to include("Entrez s'il vous plait")
  end

  it "Impossible de s'inscrire sans e-mail" do
    contact = Contact.new(name: "takashi", email: "", title: "À propos des retours", message: "Je souhaite retourner l'article portant le numéro de commande 000000000.")     
    contact.valid?
    expect(contact.errors[:email]).to include("Entrez s'il vous plait")
  end
end

Je vide simplement la partie e-mail, mais la création d'une instance à chaque fois augmente la quantité de code. *** factory_bot *** améliore cela.

Qu'est-ce que factory_bot

Une gemme qui vous permet de créer facilement des instances factices. Définissez les propriétés définies pour chaque instance de classe à l'avance dans un autre fichier et utilisez la méthode du fichier de spécifications pour créer l'instance exacte.

Si vous utilisez factory_bot, la description sera la suivante.

contact_spec.rb



RSpec.describe Contact, type: :model do
  it "Impossible de s'inscrire sans nom" do
    contact = build(:contact, name: "")
    contact.valid?
    expect(contact.errors[:name]).to include("Entrez s'il vous plait")
  end

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

Une instance est créée à l'avance dans un fichier séparé et elle est appelée.

Procédure d'installation

*** Ajout de gem'factory_bot_rails '*** au même environnement que rspec-rails

Gemfile


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

Ensuite, regroupez l'installation et Créez un répertoire appelé "usines" directement sous le répertoire spec. Dans celui-ci, créez un fichier Ruby avec le nom de fichier au pluriel de l'instance créée. Dans ce cas, il s'agit de contacts.rb.

Modifiez le fichier contacts.rb créé comme suit.

contacts.rb


FactoryBot.define do
  factory :contact do
    name {"takashi"}
    email {"[email protected]"}
    title {"À propos des retours"}
    message {"Je souhaite retourner l'article portant le numéro de commande 000000000."}
  end
end

Ensuite, lors de la création d'une instance, vous pouvez créer une instance avec le contenu du modèle d'ensemble en écrivant ce qui suit.

#factory_Lorsque vous n'utilisez pas de bot
contact = Contact.new(name: "", email: "[email protected]", title: "À propos des retours", message: "Je souhaite retourner l'article portant le numéro de commande 000000000.")
#factory_Lors de l'utilisation du bot
contact = FactoryBot.build(:contact)

C'était plutôt rafraîchissant. De plus, en éditant spec / rails_helper.rb comme suit, vous pouvez omettre la description de FactoryBot de la classe qui est le récepteur.

rails_helper.rb


RSpec.configure do |config|
  #Ajout de la description suivante
  config.include FactoryBot::Syntax::Methods

  #réduction
end

Sur la base de ce qui précède, j'écrirai un code de test supplémentaire.

contact_spec.rb



require 'rails_helper'

RSpec.describe Contact, type: :model do
  it "Impossible de s'inscrire sans nom" do
    contact = build(:contact, name: "")
    contact.valid?
    expect(contact.errors[:name]).to include("Entrez s'il vous plait")
  end

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

  it "@Domaine après la marque" do
    contact = build(:contact, email: "example@eee")
    contact.valid?
    expect(contact.errors[:email]).to include("Est une valeur non valide")
  end

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

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


Ceci est le formulaire rempli pour le moment.

À la fin

Cette fois, nous avons effectué un test sur la validation du modèle de contact, mais il existe différentes manières de l'écrire en fonction des spécifications de l'application WEB. J'espère que cela vous aidera à comprendre le plus possible le monde des tests. Il semble que la méthode de test du contrôleur sera différente, j'espère donc l'améliorer bientôt.

En comprenant un peu le test, j'en suis venu à penser que lors du développement de la prochaine application, j'aimerais écrire le code de test et ensuite l'implémenter. Nous vous serions reconnaissants de bien vouloir commenter toute correction ou correction du contenu de l'article.

Merci d'avoir lu pendant longtemps!

Recommended Posts

[Rails] Test avec RSpec
[rails] Faisons un test unitaire avec Rspec!
Testez Nokogiri avec Rspec.
[Ruby on Rails] Test du contrôleur avec RSpec
[Ruby on Rails] Test de modèle avec RSpec
Tester Active Strage avec RSpec
[Rails] Code de test à l'aide de Rspec
Tester le résolveur GraphQL avec rspec
[Rails] À propos du test de réponse Rspec
[Rails5] Rspec -Test d'unité lors de l'imbrication-
Copier et coller le test avec RSpec
Test du tutoriel sur les rails
Principes de base de Rspec [Rails]
[Rails5] Rspec -validation-
Comprendre la couverture du code avec Rspec, le framework de test Ruby on Rails
Exécution du code de test RSpec
Test d'intégration avec Gradle
[Pour les débutants] Testez l'enregistrement des utilisateurs avec RSpec
[Rails 6] Erreur d'exécution avec $ rails s
Manipuler le dispositif avec des rails
[Rails] Didacticiel Apprendre avec les rails
Présentation de Rspec, un framework de test pour Ruby on Rails
Utiliser Webmock avec Rspec
[Rails] Développement avec MySQL
Tester automatiquement avec la jauge
Test de charge avec JMeter
Les débutants de Rails ont essayé de se lancer avec RSpec
Rails, procédure d'installation RSpec
Faites un test unitaire avec Junit.
Prend en charge la multilinguisme avec Rails!
[Rails] Je veux tester avec RSpec. Nous soutenons votre démarche [Procédure d'introduction]
[Rails] De la préparation du test au test unitaire du modèle [RSpec]
Exécutez des tests Ruby on Rails RSpec avec des actions GitHub
[Rails / RSpec] Ecrire un test de modèle (avec Shoulda Matchers / FactoryBot)
Erreur de test Rails5 Rspec ArgumentError: Usine non enregistrée: utilisateur
Exécuter les meilleures pratiques RSpec, Brakeman, Rubocop, Rails avec overcommit
rails test db seulement chute
Vérifiez la valeur CSV avec RSpec
[Rails] Polymorphique express avec graphql-ruby
[Rails] Télécharger des vidéos avec Rails (ActiveStorage)
[Vue Rails] "Hello Vue!" Affiché avec Vue + Rails
[RSpec] Utilisons FactoryBot [Rails]
Préparation au développement avec Rails
Exécuter des rails à chaque fois dans le docker
[Docker] Construction de l'environnement Rails 5.2 avec docker
Utilisez plusieurs bases de données avec Rails 6.0
[Rails] Spécifiez le format avec link_to
[Docker] À utiliser à tout moment avec Docker + Rails