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!
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.
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.
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.
L'objectif est d'écrire et d'exécuter du code de test pour la validation du modèle, qui est un test unitaire.
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".
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.
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.
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
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.
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.
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.
*** 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.
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