Ceci est l'article précédent [1er] RSpec débutant a écrit ModelSpec en tant que débutant. Si vous voulez en savoir plus sur ModelSpec, veuillez consulter l'article précédent!
De plus, l'autre jour, une session d'étude pour débutants (RSpec Beginners !!) a eu lieu avec la gentillesse du RSpec male Junichi Ito @jnchito. J'ai également participé à "RSpec Beginners !!"), donc je pense que vous pouvez approfondir votre compréhension en regardant cette vidéo, alors jetez un œil si vous le souhaitez.
** Cible **
J'essaye d'écrire RSpec, mais je ne suis pas sûr de ce que c'est ~: hugging: Pour les débutants.
Cependant, [Introduction à RSpec qui peut être utilisé, Partie 1 "Comprendre la syntaxe de base et les fonctions utiles de RSpec"] de M. Ito (https://qiita.com/jnchito/items/42193d066bd61c740612 "Introduction à RSpec qui peut être utilisé, Partie 1" Comprendre la syntaxe de base et les fonctionnalités utiles de RSpec "")
Il est souhaitable de comprendre le rôle de décrire, il, attend au moins, comme regarder le contenu de cet article dans une certaine mesure ou avoir fait quelque chose.
** Code de référence ** Comme mentionné ci-dessus, je vais le décrire en référence à mon propre portfolio, donc je publierai le lien GitHub ici, mais la cible du test est le site Veuillez noter que nous nous concentrons sur les fonctions de base. ** [Fonctions de base du site] ** (Nouvelle inscription / connexion / édition des membres individuels / corporatifs, demande d'inscription des membres corporatifs, publication / édition d'articles, DM, notification, etc.)
** Préparation à la rédaction des tests ** Afin d'écrire un test avec RSpec, il est nécessaire d'insérer et de définir des gemmes dont gem'rspec-rails '. Préparez-vous d'abord à écrire le test, puis à le lire. Ce dont vous avez besoin est décrit dans "Everyday Rails-Introduction to Rails Testing with RSpec". Ou plutôt, si vous regardez ceci, vous pouvez le comprendre sans regarder cet article. Si vous voulez voir le code comme un exemple concret, veuillez le lire tel quel. (C'est vraiment juste pour référence)
Qu'est-ce que la ** spécification système ** en premier lieu? : penser: je pense que certaines personnes disent.
Imaginez, par exemple, que vous utilisez un site Web. Créer un compte, se connecter, modifier ma page, publier quelque chose, envoyer un DM à quelqu'un, etc., il n'y a pas de fin, mais je vais prendre des mesures sur le navigateur actuel droite? Les spécifications du système testent que cette ** action de l'utilisateur sur le navigateur réel fonctionne correctement **. C'est important car il cible les choses que les utilisateurs déplacent réellement lors de la consultation du site Web. Par conséquent, à la fin de l'article précédent, j'ai mentionné qu'il est important d'écrire les spécifications du modèle, mais il est important d'écrire les spécifications du système.
De plus, si vous cherchez un article sur RSpec, vous verrez ** "caractéristiques des fonctionnalités" **, mais pensez que c'est le prédécesseur des spécifications système. À partir de RSpec 3.7, vous pouvez ajouter des spécifications système à la suite de tests pour les applications Rails 5.1 et ultérieures, donc si vous utilisez une version supérieure ou ultérieure, écrivons les spécifications système. ..
En passant, divers paramètres sont nécessaires pour décrire les spécifications du système, veuillez donc vous référer à Everyday Rails pour les gemmes et les paramètres requis.
La dernière fois, j'ai utilisé FactoryBot pour préparer les données préliminaires. Il est également utilisé lors de la rédaction des spécifications du système. Pour plus d'informations sur FactoryBot, reportez-vous à l'article précédent.
①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
Maintenant écrivons le code de test. Exécution de $ rails g rspec: les utilisateurs du système créeront users_spec.rb dans le dossier spec / system. Le code de test (mouvement réel sur le navigateur, etc.) sera écrit dans ce fichier. Voici un exemple complet.
②spec/system/users_spec.rb
require 'rails_helper'
RSpec.describe 'User', type: :system do
let(:user){FactoryBot.create(:user)}
describe 'Test d'authentification de l'utilisateur' do
describe 'Enregistrement d'un nouvel utilisateur' do
before do
visit new_user_registration_path #Transition vers un nouvel écran d'inscription
end
context 'Transition vers un nouvel écran d'inscription' do
it 'Nouvelle inscription réussie' do
# fill_Entrez les informations d'enregistrement dans la zone de texte avec dans
fill_in 'Nom(Nom de famille)', with: "tester"
fill_in 'Nom(Nom)', with: "Jiro"
fill_in 'Frigana(Nom de famille)', with: "tester"
fill_in 'Frigana(Mei)', with: "Jiro"
fill_in 'adresse mail', with: "[email protected]"
fill_in 'Code postal(pas de trait d'union)', with: "2222222"
fill_in 'adresse de rue', with: "123 Adachi-ku, Tokyo-12-1"
fill_in 'numéro de téléphone(pas de trait d'union)', with: "22222222222"
fill_in 'mot de passe', with: "testjiro"
fill_in 'Confirmation du mot de passe', with: "testjiro"
click_button 's'inscrire' #Cliquez sur le bouton
expect(page).to have_content 'L'enregistrement du compte est terminé.'
end
it 'La nouvelle inscription échoue' do
fill_in 'Nom(Nom de famille)', with: ""
fill_in 'Nom(Nom)', with: ""
fill_in 'Frigana(Nom de famille)', with: ""
fill_in 'Frigana(Mei)', with: ""
fill_in 'adresse mail', with: ""
fill_in 'Code postal(pas de trait d'union)', with: ""
fill_in 'adresse de rue', with: ""
fill_in 'numéro de téléphone(pas de trait d'union)', with: ""
fill_in 'mot de passe', with: ""
fill_in 'Confirmation du mot de passe', with: ""
click_button 's'inscrire'
expect(page).to have_content 'Les membres individuels n'ont pas été enregistrés.'
end
end
end
describe 'Utilisateur en ligne' do
before do
visit new_user_session_path
end
context 'Transition vers l'écran de connexion' do
it 'Connexion réussie' do
fill_in "adresse mail", with: user.email
fill_in 'mot de passe', with: user.password
click_button 'S'identifier'
expect(page).to have_content 'Vous êtes maintenant connecté.'
end
it 'La connexion échoue' do
fill_in 'adresse mail', with: ''
fill_in 'mot de passe', with: ''
click_button 'S'identifier'
expect(current_path).to eq new_user_session_path
end
end
end
end
describe 'Test utilisateur' do
before do
visit new_user_session_path
fill_in 'adresse mail', with: user.email
fill_in 'mot de passe', with: user.password
click_button 'S'identifier'
end
describe 'Tester ma page' do
it 'Ma page s'affiche dans l'en-tête' do
expect(page).to have_content('Ma page')
end
it 'Accédez à Ma page et le lien de modification s'affiche' do
visit user_path(user)
expect(page).to have_content('Éditer')
end
end
describe 'Test d'édition' do
context 'Transition vers l'écran d'édition' do
it 'Peut faire la transition' do
visit edit_user_path(user)
expect(current_path).to eq edit_user_path(user)
end
end
context 'Vérifier et modifier l'affichage' do
before do
visit edit_user_path(user)
end
it 'Il est affiché sous forme de modification des informations d'enregistrement' do
expect(page).to have_content('Modifier les informations d'inscription')
end
it 'Le formulaire d'édition d'image s'affiche' do
expect(page).to have_field 'user[profile_image]'
end
it 'Mon prénom et mon nom sont affichés sur le formulaire de modification du nom' do
expect(page).to have_field 'Nom(Nom de famille)', with: user.last_name
end
it 'Votre nom apparaît sur le formulaire de modification de nom' do
expect(page).to have_field 'Nom(Nom)', with: user.first_name
end
it 'Mon nom Kana est affiché sur le formulaire de modification du nom' do
expect(page).to have_field 'Frigana(Nom de famille)', with: user.kana_last_name
end
it 'Votre nom kana est affiché dans le formulaire d'édition de nom' do
expect(page).to have_field 'Frigana(Mei)', with: user.kana_first_name
end
it 'Votre adresse e-mail s'affiche dans le formulaire de modification d'adresse e-mail' do
expect(page).to have_field 'adresse mail', with: user.email
end
it 'Votre code postal est affiché sur le formulaire de modification du code postal' do
expect(page).to have_field 'Code postal(pas de trait d'union)', with: user.postal_code
end
it 'Votre adresse est affichée sur le formulaire de modification d'adresse' do
expect(page).to have_field 'adresse de rue', with: user.address
end
it 'Votre numéro de téléphone s'affiche dans le formulaire de modification du numéro de téléphone' do
expect(page).to have_field 'numéro de téléphone(pas de trait d'union)', with: user.phone_number
end
it 'Votre texte d'auto-introduction est affiché sur le formulaire d'édition de texte d'auto-introduction' do
expect(page).to have_field 'Auto-introduction', with: user.introduction
end
it 'Modification réussie' do
#Changement de nom en Saburo
fill_in 'Nom(Nom)', with: 'Saburo'
fill_in 'Frigana(Mei)', with: 'Sabrow'
click_button 'Enregistrez vos modifications'
expect(page).to have_content 'La mise à jour des informations sur les membres est terminée.'
expect(page).to have_content 'Tester Saburo(Sous-répertoire de test)'
expect(current_path).to eq user_path(user)
end
it 'La modification échoue' do
# first_nom nom(Nom)Entrez dans le vide
fill_in 'Nom(Nom)', with: ''
click_button 'Enregistrez vos modifications'
expect(page).to have_content 'Le membre individuel n'a pas été enregistré en raison de l'erreur.'
expect(page).to have_content 'Nom(Nom)Entrez s'il vous plait'
expect(current_path).to eq user_path(user)
end
end
end
end
end
Pour ceux qui se demandaient, "Oh, la façon dont FactoryBot est écrit est différente de la dernière fois: penser: ** let (: user) ** ??"
RSpec a une fonctionnalité appelée ** let **. Vous pouvez l'utiliser pour remplacer les variables d'instance sous la forme let (: variable) et les utiliser comme variables dans le code ultérieur. Veuillez consulter cet article pour plus de détails. Quand utilisez-vous RSpec let? (Traduction) Par rapport à l'enfermer dans le bloc avant, la quantité de code est plus petite et il ressemble plus à RSpec, alors utilisons-le. Cependant, comme décrit dans l'article de référence, let a la caractéristique de ** "évaluation retardée" **, vous devez donc être prudent. Cela sera expliqué dans l'exemple de code ci-dessous. (C'est pourquoi je suis devenu accro au marais)
②spec/system/users_spec.rb
let(:user){FactoryBot.create(:user)}
describe 'Test d'authentification de l'utilisateur' do
describe 'Enregistrement d'un nouvel utilisateur' do
before do
visit new_user_registration_path #Transition vers un nouvel écran d'inscription
end
context 'Transition vers un nouvel écran d'inscription' do
it 'Nouvelle inscription réussie' do
# fill_Entrez les informations d'enregistrement dans la zone de texte avec dans
fill_in 'Nom(Nom de famille)', with: "tester"
fill_in 'Nom(Nom)', with: "Jiro"
fill_in 'Frigana(Nom de famille)', with: "tester"
fill_in 'Frigana(Mei)', with: "Jiro"
fill_in 'adresse mail', with: "[email protected]"
fill_in 'Code postal(pas de trait d'union)', with: "2222222"
fill_in 'adresse de rue', with: "123 Adachi-ku, Tokyo-12-1"
fill_in 'numéro de téléphone(pas de trait d'union)', with: "22222222222"
fill_in 'mot de passe', with: "testjiro"
fill_in 'Confirmation du mot de passe', with: "testjiro"
click_button 's'inscrire' #Cliquez sur le bouton
expect(page).to have_content 'L'enregistrement du compte est terminé.'
end
Tout d'abord, il y a une description de visit new_user_registration_path dans le bloc before. Cette ** visite ** est une fonctionnalité de ** Capybara ** qui vous permet d'accéder à une page spécifique avec visite + chemin. ** Capybara ** est une fonction pratique qui vous permet de passer d'une page à l'autre comme si l'utilisateur utilisait réellement le site Web et de vérifier s'il y a des problèmes à ce moment-là (Capybara est différentes pages). Imaginez courir et lever les yeux).
Avec Capybara, vous pouvez utiliser diverses fonctions utiles autres que la visite. Je pense que gem'capybara 'est attaché par défaut lorsque vous créez une application Rails, mais veuillez le vérifier. Article de référence: [Introduction à RSpec qui peut être utilisé, Partie 4 "Toute opération de navigateur est gratuite! Encyclopédie Capybara inversée"](https://qiita.com/jnchito/items/607f956263c38a5fec24 "Introduction à RSpec qui peut être utilisée, Partie 4" Toute opération de navigateur Liberté! Encyclopédie Capybara inversée "")
visit new_user_registration_path
⇨ Vous êtes passé au nouvel écran d'enregistrement.fill_in'First name (last name) ', avec:" Test "
⇨ Entrez la chaîne "test" dans la zone de texte du prénom (nom). Saisissez également les informations d'enregistrement suivantes.click_button'Nouvel enregistrement'
⇨ Cliquez sur le bouton Nouvel enregistrementLes bases sont les mêmes pour la connexion et la modification des informations d'inscription sur Ma page, veuillez donc vous y référer lors de la rédaction!
À propos, click_button est utilisé pour le bouton d'envoi et la balise de bouton. D'un autre côté, s'il a la même apparence en CSS mais qu'il s'agit d'un lien, utilisez click_link. Click_on peut être utilisé avec l'un ou l'autre. Alors, click_on est bon, non? Je vous ai pensé là-bas. J'ai aussi pensé: étreindre: séparer explicitement le bouton d'envoi de données et le lien de transition? Je me suis demandé si c'était comme ça, mais y a-t-il un autre mérite à le diviser? Je veux que vous me disiez les détails.
Il a été créé la dernière fois.
①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
Contrairement au nouvel enregistrement des membres individuels, le nouvel enregistrement d'une société a le flux suivant.
Les bases sont les mêmes qu'avant, donc ce ne serait pas un problème si je m'y habitue, mais c'était difficile pour les débutants et j'ai eu du mal. De plus, je n'ai pas trouvé d'article de référence pour un tel mécanisme, raison pour laquelle cet article a été écrit. (Peut-être que c'est juste une mauvaise façon de le trouver) Si vous êtes un débutant qui a créé un mécanisme similaire, j'espère que cela vous sera utile.
Voici un exemple du code complété.
②spec/system/companies_spec.rb
require 'rails_helper'
RSpec.describe "Companies", type: :system do
let!(:admin){FactoryBot.create(:admin)}
let(:company){FactoryBot.create(:company)}
describe 'Test d'authentification de l'utilisateur' do
describe 'Nouvelle demande d'enregistrement pour une société' do
before do
visit new_company_registration_path
end
it 'Demande d'inscription réussie' do
fill_in 'Nom de la compagnie', with: "Test 2 Co., Ltd."
fill_in 'Frigana', with: "Test Two Co., Ltd."
fill_in 'adresse mail', with: "[email protected]"
fill_in 'Code postal(pas de trait d'union)', with: "2222222"
fill_in 'adresse de rue', with: "222, Chiyoda-ku, Tokyo-22-2"
fill_in 'numéro de téléphone(pas de trait d'union)', with: "22222222222"
fill_in 'mot de passe', with: "test2company"
fill_in 'Confirmation du mot de passe', with: "test2company"
click_button 'Appliquer'
expect(page).to have_content 'Merci pour votre demande d'inscription. La page réservée aux membres corporatifs sera disponible une fois la demande approuvée par l'opération. Veuillez attendre un moment jusqu'à ce que vous receviez l'e-mail approuvé.'
end
it 'La demande d'inscription échoue' do
fill_in 'Nom de la compagnie', with: ""
fill_in 'Frigana', with: ""
fill_in 'adresse mail', with: ""
fill_in 'Code postal(pas de trait d'union)', with: ""
fill_in 'adresse de rue', with: ""
fill_in 'numéro de téléphone(pas de trait d'union)', with: ""
fill_in 'mot de passe', with: ""
fill_in 'Confirmation du mot de passe', with: ""
click_button 'Appliquer'
expect(page).to have_content "Les membres corporatifs n'ont pas été sauvés."
end
end
end
describe 'Tester jusqu'à ce que la société puisse se connecter' do
before do
#La société remplit le formulaire de demande d'inscription
visit new_company_registration_path
fill_in 'Nom de la compagnie', with: "Test 2 Co., Ltd."
fill_in 'Frigana', with: "Test Two Co., Ltd."
fill_in 'adresse mail', with: "[email protected]"
fill_in 'Code postal(pas de trait d'union)', with: "2222222"
fill_in 'adresse de rue', with: "222, Chiyoda-ku, Tokyo-22-2"
fill_in 'numéro de téléphone(pas de trait d'union)', with: "22222222222"
fill_in 'mot de passe', with: "test2company"
fill_in 'Confirmation du mot de passe', with: "test2company"
click_button 'Appliquer' #Une notification sera envoyée
end
describe 'Administrateur: Confirmation de notification-Test d'approbation de la demande' do
before do
#Connectez-vous en tant qu'administrateur
visit new_admin_session_path
fill_in 'adresse mail', with: admin.email
fill_in 'mot de passe', with: admin.password
click_button 'S'identifier'
end
it 'La demande d'enregistrement d'entreprise est affichée dans l'en-tête' do
expect(page).to have_content('Demande d'enregistrement d'entreprise')
end
it 'Le nom de la société pour laquelle vous avez postulé est affiché dans la liste des demandes d'enregistrement d'entreprise.' do
visit admin_notifications_path
expect(page).to have_content("Test 2 Il existe une demande d'enregistrement d'entreprise de Co., Ltd.")
end
it 'Vous pouvez accéder à la page des détails de l'entreprise à partir du lien' do
visit admin_notifications_path
notification = Notification.find_by({receiver_id: admin.id, receiver_class: "admin", sender_id: Company.last.id, sender_class: "company"})
within '.request-message' do
click_link 'Demande d'enregistrement d'entreprise' # ページに同一の文言のリンクがある場合(今回の場合「Demande d'enregistrement d'entreprise」)、classを指定してあげてwithin囲む
end
expect(current_path).to eq admin_company_path(notification.sender_id)
end
it 'Transition vers l'écran d'édition' do
visit admin_company_path(Company.last.id)
click_link 'Éditer'
expect(current_path).to eq edit_admin_company_path(Company.last.id)
end
it 'Rendre le statut de la demande approuvé' do
visit edit_admin_company_path(Company.last.id)
choose "company_approved_true" #Vérifier l'état de la demande comme approuvé (entreprise)_approved_true est l'identifiant de l'élément bouton radio)
click_button 'Enregistrez vos modifications'
expect(page).to have_content 'La mise à jour des informations sur l'entreprise est terminée.'
expect(current_path).to eq admin_company_path(Company.last.id)
end
end
describe 'Entreprise: test de connexion' do
context 'Connexion entreprise avant approbation' do
it 'La connexion échoue et vous êtes invité à vous reconnecter après avoir reçu l'e-mail' do
visit new_company_session_path
fill_in 'adresse mail', with: "[email protected]"
fill_in 'mot de passe', with: "test2company"
click_button 'S'identifier'
expect(page).to have_content 'La demande d'enregistrement n'a pas été approuvée. Nous sommes désolés, mais attendez un moment jusqu'à ce que vous receviez l'e-mail approuvé.'
end
end
context 'Connexion entreprise après approbation' do
before do
login_as(admin) #Connexion administrateur
visit edit_admin_company_path(Company.last.id)
choose "company_approved_true" #Vérifier l'état de la demande comme approuvé (entreprise)_approved_true est l'identifiant de l'élément bouton radio)
click_button 'Enregistrez vos modifications'
click_on 'Se déconnecter'
visit new_company_session_path
end
it 'Connexion réussie' do
fill_in 'adresse mail', with: "[email protected]"
fill_in 'mot de passe', with: "test2company"
click_button 'S'identifier'
expect(page).to have_content 'Vous êtes maintenant connecté.'
end
it 'La connexion échoue' do
fill_in 'adresse mail', with: ""
fill_in 'mot de passe', with: ""
click_button 'S'identifier'
expect(current_path).to eq new_company_session_path
end
end
end
end
describe 'Test des membres corporatifs' do
before do
visit new_company_session_path
fill_in 'adresse mail', with: company.email
fill_in 'mot de passe', with: company.password
click_button 'S'identifier'
end
describe 'Tester ma page' do
it 'Ma page s'affiche dans l'en-tête' do
expect(page).to have_content('Ma page')
end
it 'Accédez à Ma page et le lien de modification s'affiche' do
visit corporate_company_path(company)
expect(page).to have_content('Éditer')
end
end
describe 'Test d'édition' do
before do
visit edit_corporate_company_path(company)
end
context 'Confirmer la transition vers l'écran d'édition' do
it 'Peut faire la transition' do
expect(current_path).to eq edit_corporate_company_path(company)
end
end
context 'Confirmation de l'affichage et de l'édition' do
it 'Il est affiché sous forme de modification des informations d'enregistrement' do
expect(page).to have_content('Modifier les informations d'inscription')
end
it 'Le formulaire de modification de l'image de profil s'affiche' do
expect(page).to have_field 'company[profile_image]'
end
it 'Le formulaire de modification de l'image d'en-tête s'affiche' do
expect(page).to have_field 'company[background_image]'
end
it 'Le nom de l'entreprise est affiché sur le formulaire d'édition du nom de l'entreprise' do
expect(page).to have_field 'Nom de la compagnie', with: company.company_name
end
it 'Le nom de votre entreprise Kana est affiché sur le formulaire d'édition Frigana' do
expect(page).to have_field 'Frigana', with: company.kana_company_name
end
it 'Votre adresse e-mail s'affiche dans le formulaire de modification d'adresse e-mail' do
expect(page).to have_field 'adresse mail', with: company.email
end
it 'Votre code postal est affiché sur le formulaire de modification du code postal' do
expect(page).to have_field 'Code postal(pas de trait d'union)', with: company.postal_code
end
it 'Votre adresse est affichée sur le formulaire de modification d'adresse' do
expect(page).to have_field 'adresse de rue', with: company.address
end
it 'Votre numéro de téléphone s'affiche dans le formulaire de modification du numéro de téléphone' do
expect(page).to have_field 'numéro de téléphone(pas de trait d'union)', with: company.phone_number
end
it 'Votre texte d'auto-introduction est affiché sur le formulaire d'édition de texte d'auto-introduction' do
expect(page).to have_field 'Auto-introduction', with: company.introduction
end
it 'Modification réussie' do
fill_in 'Auto-introduction', with: "Bienvenue sur ma page de Test Co., Ltd.!"
click_button 'Enregistrez vos modifications'
expect(page).to have_content 'La mise à jour des informations sur l'entreprise est terminée.'
expect(current_path).to eq corporate_company_path(company)
end
it 'La modification échoue' do
fill_in 'Nom de la compagnie', with: ""
click_button 'Enregistrez vos modifications'
expect(page).to have_content 'Le membre corporatif n'a pas été enregistré en raison de l'erreur.'
end
end
end
end
end
spec/factories/admins.rb
FactoryBot.define do
factory :admin do
email { "[email protected]" }
password { "testadmin"}
end
end
La nouvelle application d'enregistrement pour la société et le test d'édition des informations d'enregistrement final sont presque les mêmes que ceux de users_spec.rb, donc les explications sont omises.
②spec/system/companies_spec.rb
describe 'Tester jusqu'à ce que la société puisse se connecter' do
before do
# 1.La société remplit le formulaire de demande d'inscription
visit new_company_registration_path
fill_in 'Nom de la compagnie', with: "Test 2 Co., Ltd."
fill_in 'Frigana', with: "Test Two Co., Ltd."
fill_in 'adresse mail', with: "[email protected]"
fill_in 'Code postal(pas de trait d'union)', with: "2222222"
fill_in 'adresse de rue', with: "222, Chiyoda-ku, Tokyo-22-2"
fill_in 'numéro de téléphone(pas de trait d'union)', with: "22222222222"
fill_in 'mot de passe', with: "test2company"
fill_in 'Confirmation du mot de passe', with: "test2company"
click_button 'Appliquer' #Une notification sera envoyée
end
describe 'Administrateur: Confirmation de notification-Test d'approbation de la demande' do
before do
# 2.Connectez-vous en tant qu'administrateur
visit new_admin_session_path
fill_in 'adresse mail', with: admin.email
fill_in 'mot de passe', with: admin.password
click_button 'S'identifier'
end
# 3.Confirmez que l'administrateur s'est connecté car il y a un libellé de demande d'enregistrement d'entreprise
it 'La demande d'enregistrement d'entreprise est affichée dans l'en-tête' do
expect(page).to have_content('Demande d'enregistrement d'entreprise')
end
# 4.Cliquez sur le lien de demande d'enregistrement d'entreprise et confirmez le nom de l'entreprise d'application
it 'Le nom de la société pour laquelle vous avez postulé est affiché dans la liste des demandes d'enregistrement d'entreprise.' do
visit admin_notifications_path
expect(page).to have_content("Test 2 Il existe une demande d'enregistrement d'entreprise de Co., Ltd.")
end
# 5.Cliquez sur le lien "Demande d'enregistrement d'entreprise" dans la liste des demandes
it 'Vous pouvez accéder à la page des détails de l'entreprise à partir du lien' do
visit admin_notifications_path
notification = Notification.find_by({receiver_id: admin.id, receiver_class: "admin", sender_id: Company.last.id, sender_class: "company"})
within '.request-message' do
click_link 'Demande d'enregistrement d'entreprise' # ページに同一の文言のリンクがある場合(今回の場合「Demande d'enregistrement d'entreprise」)、classを指定してあげてwithin囲む
end
expect(current_path).to eq admin_company_path(notification.sender_id)
end
# 6.Aller à la page de modification des informations d'inscription
it 'Transition vers l'écran d'édition' do
visit admin_company_path(Company.last.id)
click_link 'Éditer'
expect(current_path).to eq edit_admin_company_path(Company.last.id)
end
# 7.Faites attention au bouton radio
it 'Rendre le statut de la demande approuvé' do
visit edit_admin_company_path(Company.last.id)
choose "company_approved_true" #Vérifier l'état de la demande comme approuvé (entreprise)_approved_true est l'identifiant de l'élément bouton radio)
click_button 'Enregistrez vos modifications'
expect(page).to have_content 'La mise à jour des informations sur l'entreprise est terminée.'
expect(current_path).to eq admin_company_path(Company.last.id)
end
end
describe 'Entreprise: test de connexion' do
context 'Connexion entreprise avant approbation' do
it 'La connexion échoue et vous êtes invité à vous reconnecter après avoir reçu l'e-mail' do
visit new_company_session_path
fill_in 'adresse mail', with: "[email protected]"
fill_in 'mot de passe', with: "test2company"
click_button 'S'identifier'
expect(page).to have_content 'La demande d'enregistrement n'a pas été approuvée. Nous sommes désolés, mais attendez un moment jusqu'à ce que vous receviez l'e-mail approuvé.'
end
end
context 'Connexion entreprise après approbation' do
before do
login_as(admin) #Connexion administrateur
visit edit_admin_company_path(Company.last.id)
choose "company_approved_true" #Vérifier l'état de la demande comme approuvé (entreprise)_approved_true est l'identifiant de l'élément bouton radio)
click_button 'Enregistrez vos modifications'
click_on 'Se déconnecter'
visit new_company_session_path
end
it 'Connexion réussie' do
fill_in 'adresse mail', with: "[email protected]"
fill_in 'mot de passe', with: "test2company"
click_button 'S'identifier'
expect(page).to have_content 'Vous êtes maintenant connecté.'
end
it 'La connexion échoue' do
fill_in 'adresse mail', with: ""
fill_in 'mot de passe', with: ""
click_button 'S'identifier'
expect(current_path).to eq new_company_session_path
end
end
end
end
La description ci-dessus, qui semble convenir à première vue, était l'entrée du marais.
** La société remplit le formulaire de demande d'inscription ** Dans le bloc avant, la société remplit le formulaire de demande d'enregistrement et décrit jusqu'au moment où le bouton de demande est enfoncé. À ce stade, la notification d'application a été envoyée à l'administrateur.
** Point d'arrêt: étreindre: Connectez-vous en tant qu'administrateur "laissez retarder l'évaluation" **
J'ai dit: "D'accord, connectez-vous d'abord en tant qu'administrateur pour approuver l'application ... ça? Le test échoue, pourquoi ... ??"
Je n'ai pas trouvé de raison pour que le test échoue ici pendant un certain temps et je suis tombé dans une spirale négative.
Si vous regardez attentivement, vous pouvez voir la description de let (: admin) {FactoryBot.create (: admin)}, et la partie notable est ** let (: admin) **. À première vue, il ne semble y avoir rien de mal à cela, mais comme je l'ai mentionné plus tôt, laissez a la caractéristique de ** "évaluation retardée" **.
Qu'est-ce que l'évaluation des retards? Si vous: pensez:, veuillez lire cet article.
Soyez prudent lors de la création avec RSpec let ~ Delay evaluation ~
Quand utilisez-vous RSpec let? (Traduction)
Selon cet article, lorsque vous créez avec juste let, la variable affectée est évaluée au moment où elle est référencée = évaluation du délai.
En d'autres termes, à moins que la variable admin soit utilisée, telle que fill_in'email address ', avec: admin.email
, le contenu des données de admin est considéré comme inexistant. Je vois, mais je pensais que j'écrivais admin, mais quand j'ai essayé ** let! **, le test a réussi.
Hmmm, j'ai réussi, mais je me demande pourquoi ... Je pensais que c'était parce que certaines des descriptions se chevauchaient, mais je n'ai pas compris après tout. .. Si vous connaissez ceci, faites-le moi savoir. ..
** Confirmez que l'administrateur s'est connecté car il existe un libellé de la demande d'enregistrement d'entreprise ** Il y a un lien * Demande d'enregistrement d'entreprise * dans l'en-tête après la connexion de l'administrateur, alors assurez-vous qu'il est affiché et confirmez que vous êtes connecté.
** Cliquez sur le lien pour la demande d'enregistrement d'entreprise et confirmez le nom de la société candidate ** Lorsque vous cliquez sur le lien dans l'en-tête, le nom de l'entreprise s'affiche, vérifiez donc s'il s'agit de l'entreprise pour laquelle vous avez postulé dans 1.
** Point de rupture: étreindre: "Cliquez sur le lien" Demander l'enregistrement d'entreprise à partir de la liste des candidatures "** J'ai trébuché ici. Ce à quoi vous devez faire attention est la partie incluse dans ** within'.request-message 'do **. Ce que je veux faire maintenant est de cliquer sur le lien «Demande d'enregistrement d'entreprise» et de passer à la page des détails de l'entreprise. Normalement, vous devriez pouvoir effectuer la transition avec click_link ou click_on. Cependant, cela n'a pas fonctionné et j'ai eu une erreur. Voici la déclaration d'erreur à ce moment.
Capybara::Ambiguous: Correspondance ambiguë, trouvé 2 éléments correspondant au lien visible "Demande d'enregistrement d'entreprise"
Pour résumer ceci ** Kapibara "Oh, il y a deux liens appelés" Demande d'enregistrement d'entreprise ", auquel dois-je aller?" ** Cela signifie que · · · J'ai remarqué ici.
Il y en a deux ... je suis désolé Kapibara ... Suite à la recherche sur Google de la méthode d'amélioration, spécifiez le nom d'ID (request_message) unique de la partie cible de la vue au lieu de ~~ click_link, et le code de test est ** find ("# request_message"). Cliquez sur ** Il a été résolu par la description. Spécifiez l'identifiant et cliquez sur la personne cible. ~~ ** Ajouté le 01 octobre 2020 ** Comme indiqué dans le commentaire, il a été résolu avec. C'est mieux car il clique simplement comme il apparaît dans le navigateur!
②spec/system/companies_spec.rb
within '.request-message' do
click_link 'Demande d'enregistrement d'entreprise' # ページに同一の文言のリンクがある場合(今回の場合「Demande d'enregistrement d'entreprise」)、classを指定してあげてwithinで囲む
end
<td class="text-center request-message"> #Demande à la partie cible de la vue-Spécifiez une classe appelée message. Cibler ici
<strong><%= notification.sender_name %></strong>De<%= link_to 'Demande d'enregistrement d'entreprise', admin_company_path(notification.sender_id) %>il y a. Veuillez vérifier les détails de votre inscription.
<%= " (#{time_ago_in_words(notification.created_at)}Avant)" %>
</td>
** Aller à la page de modification des informations d'inscription ** C'est facile ici. Je n'expliquerai pas en particulier.
** Point de trébuchement: étreindre: "Attention aux boutons radio" **
Utilisez la fonction de sélection de Capybara pour vérifier l'état de l'application comme approuvé.
Écrivez dans le formulaire choisissez" company_approved_true "
. D'où vient "company_approved_true"? Si vous utilisez l'outil de vérification de Google, vous pouvez voir que le nom d'ID est attribué dans la balise d'entrée. Le bouton radio se présente sous la forme d'une sélection en spécifiant son identifiant. Cependant, lorsque vous consultez d'autres articles, il existe également des articles qui sélectionnent la chaîne de caractères dans la balise d'étiquette comme cible. Dans ce cas, la chaîne est "approuvée". Lors de la visualisation sur un navigateur, vous devez normalement sélectionner en regardant la chaîne de caractères. Par conséquent, il peut être préférable de ne pas utiliser autant que possible la méthode de "sélection en spécifiant l'identifiant avec l'outil de vérification". Je l'ai fait comme ça parce que le test n'a pas réussi lorsque j'ai spécifié une chaîne de caractères. Si quelqu'un est familier avec cela, faites-le moi savoir. Même si l'erreur peut être résolue, la partie "pourquoi c'est" n'a pas été résolue, je suis donc désolé pour ceux qui lisent cet article. .. Si vous découvrez, faites-le moi savoir: bow_tone1:
Oui! C'est pourquoi l'administrateur confirme la notification - le test d'approbation de l'application est terminé!
Enfin, écrivez un test pour voir si des restrictions de connexion sont en place avant et après l'approbation. Ceux qui l'ont vu jusqu'à présent le comprendront probablement, alors écrivez-le en vous référant au code!
En guise de point, je n'expliquerai brièvement que la description login_as (admin)
dans le bloc avant dans le test de connexion d'entreprise après approbation!
Tout ce que je fais est simplement de me connecter en tant qu'administrateur, mais la fonctionnalité "login_as" n'a pas le "configure pour activer les méthodes d'assistance de conception dans RSpec" que j'ai mentionné dans l'article précédent. Vous ne pouvez pas l'utiliser, alors faites attention ici!
Qu'Est-ce que c'est? Pour ceux qui ont réfléchi, l'article précédent [1er] débutant RSpec a écrit ModelSpec en tant que débutant que j'ai écrit ModelSpec en tant que débutant.
Cette fois, nous avons principalement résumé le test d'authentification des membres individuels et des membres corporatifs par les spécifications du système. Je pensais écrire un test de publication, d'édition, de DM et de notification d'articles, mais c'était plus long que prévu, donc je vais le diviser ici. Je publierai les spécifications système de cette fonction la prochaine fois, donc j'espère que vous pourrez la voir si vous le souhaitez.
Merci d'avoir regardé jusqu'au bout!
** Ajouté le 01.10.2020 ** Comme indiqué dans les commentaires, nous avons corrigé les parties telles que fill_in. À ce moment-là, si la balise d'étiquette n'est pas écrite dans la forme correcte, cela ne fonctionnera pas bien, alors soyez prudent. Veuillez vous référer à la section des commentaires pour savoir comment écrire.
[Introduction à RSpec qui peut être utilisé, Partie 4 "Toute opération de navigateur est gratuite! Encyclopédie Capybara inversée"](https://qiita.com/jnchito/items/607f956263c38a5fec24 "Introduction à RSpec qui peut être utilisé, Partie 4" Toute opération de navigateur est gratuite ! Encyclopédie Capybara inversée "") Soyez prudent lors de la création avec RSpec let ~ Delay evaluation ~ Quand utilisez-vous RSpec let? (Traduction)
Recommended Posts