[Ruby on Rails] Test du contrôleur avec RSpec

Environnement de développement

ruby 2.5.7 Rails 5.2.4.3 OS: macOS Catalina

supposition

Nous partirons du principe que cela est fait. [Ruby on Rails] Jusqu'à l'introduction de RSpec

Cliquez ici pour tester le modèle [Ruby on Rails] Test du modèle avec RSpec

Préparation au test du contrôleur

・ Créer une action

Cette fois uniquement lorsque l'utilisateur se connecte Testez s'il est affiché.

app/controllers/posts_controller.rb


class Admins::PostsController < ApplicationController
  before_action :authenticate_user!
  def index
    @posts = Post.all
  end
end
Supplément [before_action: authenticate_user!] Une méthode d'aide pour la conception de gemmes.

・ Création d'un fichier

① Créez un dossier de demandes et un dossier d'usines selon les spécifications. Dans le dossier des requêtes, créez également un fichier pour le contrôleur que vous souhaitez tester Créez un modèle de données factices dans le dossier usines.

Cette fois pour tester le post-contrôleur La structure des fichiers est la suivante.

spec/requests/posts_request_spec.rb
→ Décrivez le contenu que vous souhaitez tester.

spec/factories/post.rb
spec/factories/admin.rb
→ Créez des données factices.

② Vous permet d'utiliser FactoryBot. Il est pratique à utiliser car vous pouvez enregistrer la base de données et créer le modèle comme user = create (: user). Créez un dossier de support et un fichier factory_bot.rb sous spec et décrivez comme suit.

spec/support/factory_bot.rb


RSpec.configure do |config|
  config.include FactoryBot::Syntax::Methods
end

Ajoutez ensuite ce qui suit:

spec/rails_helper.rb


# This file is copied to spec/ when you run 'rails generate rspec:install'
require 'spec_helper'
ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../config/environment', __dir__)
# Prevent database truncation if the environment is production
abort("The Rails environment is running in production mode!") if Rails.env.production?
require 'rspec/rails'
require 'support/factory_bot' #<-Ajout

...

Modification de rails_helper.rb

Le contenu suivantRSpec.configure do |config|Ajouter à.

  • Avec cette description, la méthode sign_in peut être utilisée.

spec/rails_helper.rb


RSpec.configure do |config|

...

  config.include Devise::Test::IntegrationHelpers, type: :request # <--ajouter à
end

Code réel

Tout d'abord, créez des données factices.

spec/factories/admin.rb


FactoryBot.define do
  factory :admin do
    email { Faker::Internet.email }
    phone_number { 12345678909 }
    password { 'password' }
    password_confirmation { 'password' }
  end
end

spec/factories/post.rb


FactoryBot.define do
  factory :post do
    body { Faker::Lorem.characters(number:20) }
    admin
  end
end

Ensuite, écrivez le code de test.

spec/requests/posts_request_spec.rb


require 'rails_helper'

RSpec.describe "test post-contrôleur", type: :request do
  let(:admin) { create(:admin) }
  let(:post) { create(:post) }
  describe 'Connecté' do
    before do
      sign_in admin
    end
    context "La page de la liste des articles s'affiche correctement" do
      before do
        get admins_posts_path
      end
      it 'La demande doit être 200 OK' do
        expect(response.status).to eq 200
      end
      it 'Le titre s'affiche correctement' do
        expect(response.body).to include("Liste des messages")
      end
    end
  end
  describe 'Non-connexion' do
    context "Ne passe pas à la page de la liste des articles" do
      before do
        get admins_posts_path(admin)
      end
      it 'La demande doit être 401 OK' do
        expect(response.status).to eq 401
      end
    end
  end


  # get admins_posts_path(admin)Si tel est le cas, il s'agit d'une erreur 401 car le mot de passe est différent.
  # get admins_posts_S'il s'agit d'un chemin, ce sera une redirection 302, veuillez donc le décrire par la personne que vous souhaitez tester.

  # describe 'Non-connexion' do
  #   context "Ne passe pas à la page de la liste des articles" do
  #     before do
  #       get admins_posts_path
  #     end
  #     it 'La demande doit être 302 OK' do
  #       expect(response.status).to eq 302
  #     end
  #   end
  # end
end

Ensuite, procédez comme suit dans votre terminal:

Terminal


$ rspec spec/requests

Si vous réussissez le test

Finished in 3.64 seconds (files took 2.75 seconds to load)
3 examples, 0 failures

Comme il est affiché comme ceci, cela signifie que le contenu du test est correct.

Référence (extrait du test du modèle)

[Ruby on Rails] Test du modèle avec RSpec Au contraire, s'il ne réussit pas le test, vous pouvez voir où l'erreur se produit de cette manière, donc Vous pourrez voir si le code de test est erroné, la validation est fausse, etc.

Failures:

  1)Post-test du modèle Colonne du titre du test de validation Doit contenir 20 caractères maximum
     Failure/Error: let!(:post) { build(:post) }

     NoMethodError:
       undefined method `build' for #<RSpec::ExampleGroups::Post::Nested::Title:0x000000000619e938>
     # ./spec/models/post_spec.rb:9:in `block (3 levels) in <top (required)>'

  2)Post-test du modèle Colonne du titre du test de validation Ne doit pas être vide
     Failure/Error: let!(:post) { build(:post) }

     NoMethodError:
       undefined method `build' for #<RSpec::ExampleGroups::Post::Nested::Title:0x0000000007491518>
     # ./spec/models/post_spec.rb:9:in `block (3 levels) in <top (required)>'
Finished in 0.07992 seconds (files took 2.41 seconds to load)
2 examples, 2 failures

Failed examples:

rspec ./spec/models/post_spec.rb:11 #Post-test du modèle Colonne du titre du test de validation Doit contenir 20 caractères maximum
rspec ./spec/models/post_spec.rb:15 #Post-test du modèle Colonne du titre du test de validation Ne doit pas être vide

De plus, en utilisant rspec ./spec/models/post_spec.rb:11 en bas, Vous pouvez également vérifier le contenu du test individuellement comme indiqué ci-dessous.

Terminal


$ rspec spec/models/post_spec.rb:11

Résumé

Cette fois 1, l'écran de la liste des messages s'affiche-t-il correctement lorsque vous êtes connecté? 2, le titre s'affiche-t-il correctement lors de la connexion? 3, si vous n'êtes pas connecté, pouvez-vous naviguer?

J'ai testé ces 3 points.

Demandes de nom de dossier Il est demandé de tester s'il répond correctement à la demande. Par conséquent, si la demande est différente, elle renverra une erreur de 401 ou 302. Veuillez décrire en fonction de l'erreur que vous souhaitez afficher.

De plus, sur Twitter, les technologies et les idées qui n'ont pas été téléchargées sur Qiita sont également téléchargées, donc Je vous serais reconnaissant si vous pouviez me suivre. Cliquez ici pour plus de détails https://twitter.com/japwork

Recommended Posts