[RUBY] [2e] RSpec débutant a écrit SystemSpec en tant que débutant (édition Numa)

introduction

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.

Que faire dans cet article

Non couvert dans cet article

supposition

À propos des spécifications du système

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.

Test de users_spec.rb

① Utilisez FactoryBot et préparez les données utilisateur à l'avance

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

② Description du code spécifique

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)


Commençons par le test d'authentification utilisateur. Voir le code ci-dessous.

②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 "")


Maintenant, à partir d'ici, j'écrirai le code de test qui réussit le nouvel enregistrement tout en imaginant l'écran réel.
Oui, j'ai écrit un test avec des spécifications système qui réussit une nouvelle inscription! Lançons $ bundle exec rspec spec / system / users_spec.rb dans le terminal! S'il est bien fait, le résultat * 1 exemples, 0 échec * sera envoyé au terminal. Si vous obtenez une erreur, lisez l'instruction d'erreur et vérifiez s'il y a des erreurs dans le code ou s'il y a des omissions au moment de la configuration. De plus, une fois que vous vous y êtes habitué, l'enregistrement du compte ʻexpect (page) .not_to have_content 'est terminé. Il est également important d'essayer de changer après expect (page) en not_to, like'`, et de reconfirmer ** "le test échoue correctement" **. Si vous avez écrit le mauvais code de test, le test peut réussir même si vous l'avez défini intentionnellement sur not_to. Pour éviter cela, changez-le en not_to etc. et assurez-vous que le test échoue.

Les 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.

Test companies_spec.rb

① Utilisez FactoryBot et préparez à l'avance les données de l'entreprise

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

② Description du code spécifique

Contrairement au nouvel enregistrement des membres individuels, le nouvel enregistrement d'une société a le flux suivant.

  1. La société remplit le formulaire de nouvel enregistrement et clique sur le bouton Appliquer.
  2. Vous serez redirigé vers l'écran supérieur et le message «Veuillez patienter un moment jusqu'à ce que l'e-mail approuvé arrive» s'affiche. En même temps, une notification d'application est envoyée à l'administrateur.
  3. La connexion d'entreprise est limitée jusqu'à l'arrivée de l'e-mail approuvé.
  4. L'administrateur confirme la notification de candidature et met à jour le statut de la candidature sur approuvé. En même temps, un e-mail approuvé est envoyé à l'adresse enregistrée de la société.
  5. Vous pourrez vous connecter.

#### Burger de riz Tsukune aux œufs de laitue au bacon!
J'étais énervé. Le tsukkomi de M. Ueda sur les choses trop compliquées est sorti.

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

Tout d'abord, l'administrateur doit approuver l'application avant que la société ne puisse se connecter, alors créez d'abord un administrateur avec FactoryBot. Exécutez $ bin / rails g factory_bot: model admin et remplissez-le avec les exemples de données dont vous avez besoin. Vous trouverez ci-dessous un fichier contenant des exemples de données.

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.


En attendant, j'expliquerai le ** test jusqu'à ce que la société puisse se connecter **. Voir le code ci-dessous.

②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

J'ai dit: "D'accord, le fichier a également été créé ** let (: admin) {FactoryBot.create (: admin)} ** et ... maintenant vous pouvez utiliser la variable admin!"

La description ci-dessus, qui semble convenir à première vue, était l'entrée du marais.

  1. ** 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.

  2. ** 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. ..

  3. ** 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é.

  4. ** 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.

  5. ** 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>
  1. ** Aller à la page de modification des informations d'inscription ** C'est facile ici. Je n'expliquerai pas en particulier.

  2. ** 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.

À la fin

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.

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é, 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

[2e] RSpec débutant a écrit SystemSpec en tant que débutant (édition Numa)
[2e] RSpec débutant a écrit SystemSpec en tant que débutant (édition Numa)
[1er] RSpec débutant a essayé d'écrire ModelSpec en tant que débutant
[1er] RSpec débutant a essayé d'écrire ModelSpec en tant que débutant