[RUBY] Créer une API de tableau d'affichage avec autorisation de certification dans Rails 6 # 11 Test et validation du modèle utilisateur ajoutés

Création d'une API de tableau d'affichage avec autorisation de certification dans Rails 6 # 10 introduction de devise_token_auth

Préparation au test

Mettre en œuvre la validation et les tests pour l'utilisateur. Ce n'est plus le test d'abord, mais comme la conception est spéciale, je voulais l'implémenter au point où cela fonctionne, donc l'ordre est dans le désordre.

Tout d'abord, préparez les fichiers requis pour le test. Le modèle utilisateur a été généré avec devise_token_auth, les fichiers rspec et factoryBot sont donc manquants. Générez avec la commande suivante.

$ rails g rspec:model user
      create  spec/models/user_spec.rb
      invoke  factory_bot
      create    spec/factories/users.rb

Créez d'abord l'usine.

spec/factories/users.rb


# frozen_string_literal: true

FactoryBot.define do
  factory :user do
    provider { "email" }
    sequence(:email) { |n| "test#{n}@example.com" }
    uid { email }
    password { "password" }
    remember_created_at { nil }
    name { "MyString" }
    tokens { nil }
  end
end

Qu'est-il arrivé aux colonnes de la table utilisateur? Ensuite, vous pouvez vérifier le résultat de la sortie en regardant db / schema.rb.

Il y a trois points à noter dans le fichier d'usine. sequence(:email) { |n| "test#{n}@example.com" } uid { email } password { "password" } Ce sont trois.

sequence(:email) { |n| "test#{n}@example.com" } Un numéro de série est entré dans «n» de ce processus. Le premier enregistrement est [email protected], le deuxième enregistrement est test2 @ exemple.com,….

La raison de cela est que la colonne e-mail est uniquement restreinte et ne peut pas être enregistrée s'il s'agit de la même chaîne de caractères. Par exemple, s'il s'agit d'une constante ʻemail {"[email protected]"} , create_list (: user, 10) `aboutira à deux adresses e-mail ou plus correspondantes et de la mousse.

uid { email } C'est juste un simple uid avec une variable email. Le comportement de l'appareil est uid = email lorsque le fournisseur est email.

password { "password" } Le mot de passe encrypted_password se trouve dans la colonne DB, mais la chaîne hachée y est stockée. Le nom de la colonne ne correspond pas à schema.rb car vous devez entrer une valeur pour le mot de passe lors de la définition du mot de passe.

Tester le modèle utilisateur

Je veux exécuter un test similaire à post, donc copiez spec / models / post_spec.rb. Remplacez «Post» par «Utilisateur», «sujet» par «nom» et «corps» par «courrier».

spec/models/user_spec.rb


# frozen_string_literal: true

require "rails_helper"

RSpec.describe User, type: :model do
  describe "name" do
    context "Lorsque vide" do
      let(:user) do
        build(:user, name: "")
      end
      it "Devenir invalide" do
        expect(user).not_to be_valid
      end
    end
    context "par maxlength" do
      context "Pour 30 caractères" do
        let(:user) do
          build(:user, name: "Ah" * 30)
        end
        it "Devenez valide" do
          expect(user).to be_valid
        end
      end
      context "Pour 31 caractères" do
        let(:user) do
          build(:user, name: "Ah" * 31)
        end
        it "Devenir invalide" do
          expect(user).not_to be_valid
        end
      end
    end
  end

  describe "email" do
    context "Lorsque vide" do
      let(:user) do
        build(:user, email: "")
      end
      it "Devenir invalide" do
        expect(user).not_to be_valid
      end
    end
    context "par maxlength" do
      context "Pour 100 caractères" do
        let(:user) do
          build(:user, email: "@example.com".rjust(100, "a"))
        end
        it "Devenez valide" do
          expect(user).to be_valid
        end
      end
      context "Pour 101 caractères" do
        let(:user) do
          build(:user, email: "@example.com".rjust(101, "a"))
        end
        it "Devenir invalide" do
          expect(user).not_to be_valid
        end
      end
    end
    context "Par format d'e-mail" do
      context "Si la chaîne est correcte" do
        let(:user) do
          build(:user, email: "[email protected]")
        end
        it "Devenez valide" do
          expect(user).to be_valid
        end
      end
      context "En cas de chaîne incorrecte" do
        let(:user) do
          build(:user, email: "test@example")
        end
        it "Devenir invalide" do
          expect(user).not_to be_valid
        end
      end
    end
  end
end

Les pièces suivantes ne sont pas copiées à partir de la publication mais remplacées indépendamment.

build(:user, email: "@example.com".rjust(100, "a"))
build(:user, email: "@example.com".rjust(101, "a"))

rjust est une méthode qui remplit la chaîne avec les caractères spécifiés afin qu'elle soit justifiée à droite. Essayez de l'exécuter avec rails c.

$ rails c
[1] pry(main)> "@example.com".rjust(100, "a")
=> "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@example.com"
[2] pry(main)> "@example.com".rjust(100, "a").length
=> 100

En faisant cela, vous pouvez générer des données factices qui sont parfaites pour 100 caractères.

Implémentation de la validation du modèle utilisateur

app/models/user.rb


 # frozen_string_literal: true

 #
 #Classe d'utilisateurs
 #
 class User < ActiveRecord::Base
   # Include default devise modules. Others available are:
   # :confirmable, :lockable, :timeoutable and :omniauthable
   devise :database_authenticatable, :registerable,
          :rememberable, :validatable
   include DeviseTokenAuth::Concerns::User


+  validates :name, presence: true, length: { maximum: 30 }
+  validates :email, presence: true, length: { maximum: 100 }
end

Cela passera le test rspec.

cette? Je n'ai pas écrit la validation du format de mon adresse e-mail, mais pourquoi est-ce correct? Si vous le sentez, c'est net. En fait, puisque le format de l'e-mail est vérifié par le «: validatable» du périphérique, il n'est pas nécessaire de spécifier la validation de confirmation du format de l'e-mail dans le cas du modèle dépendant du périphérique.

Écrire une spécification de demande pour l'authentification

Dans ce tutoriel, nous finirons par écrire un test simple qui ne nécessite qu'une inscription et une connexion.

$ rails g rspec:request v1/auth
      create  spec/requests/v1/auths_spec.rb
$ mv spec/requests/v1/auths_spec.rb spec/requests/v1/auth_spec.rb

Puisque auths est désagréable, renommez-le en auth. En gros, j'écrirai auth_spec.rb en me référant à spec / requests / v1 / posts_spec.rb.

spec/requests/v1/auth_spec.rb


# frozen_string_literal: true

require "rails_helper"

RSpec.describe "V1::Auth", type: :request do
  describe "POST /v1/auth#create" do
    let(:user) do
      attributes_for(:user, email: "[email protected]", name: "test d'inscription")
    end
    it "Le code de réponse normal est renvoyé" do
      post v1_user_registration_url, params: user
      expect(response.status).to eq 200
    end
    it "Un autre cas sera retourné" do
      expect do
        post v1_user_registration_url, params: user
      end.to change { User.count }.by(1)
    end
    it "le nom est renvoyé correctement" do
      post v1_user_registration_url, params: user
      json = JSON.parse(response.body)
      expect(json["data"]["name"]).to eq("test d'inscription")
    end
    it "Des erreurs sont renvoyées lorsque le paramètre n'est pas valide" do
      post v1_user_registration_url, params: {}
      json = JSON.parse(response.body)
      expect(json.key?("errors")).to be true
    end
  end

  describe "POST /v1/auth/sign_in#create" do
    let(:user) do
      create(:user, email: "[email protected]", name: "test de connexion")
      { email: "[email protected]", password: "password" }
    end
    it "Le code de réponse normal est renvoyé" do
      post v1_user_session_url, params: user, as: :json
      expect(response.status).to eq 200
    end
    it "le nom est renvoyé correctement" do
      post v1_user_session_url, params: user
      json = JSON.parse(response.body)
      expect(json["data"]["name"]).to eq("test de connexion")
    end
    it "Des erreurs sont renvoyées lorsque le paramètre n'est pas valide" do
      post v1_user_session_url, params: {}
      json = JSON.parse(response.body)
      expect(json.key?("errors")).to be true
    end
  end
end

Après avoir écrit jusqu'à présent, si rubocop et rspec réussissent normalement, validez.

A continué

Création d'une API de tableau d'affichage avec authentification et autorisation dans Rails 6 # 12 Association de l'utilisateur et de la publication [Vers la table de sérialisation]

Recommended Posts

Créer une API de tableau d'affichage avec autorisation de certification dans Rails 6 # 11 Test et validation du modèle utilisateur ajoutés
Créer une API de tableau d'affichage avec autorisation dans Rails 6 # 12 Association d'utilisateur et de publication
Créez une API de tableau d'affichage avec certification et autorisation avec Rails 6 # 1 Construction de l'environnement
Créer une API de tableau d'affichage avec autorisation de certification dans Rails 6 # 13 Accorder l'en-tête d'authentification
# 4 post-validation et mise en œuvre de test pour créer une API de tableau d'affichage avec certification et autorisation dans Rails 6
Construire une API de tableau d'affichage avec certification et autorisation avec Rails 6 # 18 ・ Implémentation du contrôleur de l'utilisateur final
Créez une API de tableau d'affichage avec certification et autorisation avec Rails 6 # 3 RSpec, FactoryBot introduit et post-modèle
Construire une API de tableau d'affichage avec certification et autorisation dans le contrôleur Rails 6 # 5, implémentation des routes
Introduction de # 10 devise_token_auth pour créer une API de tableau d'affichage avec autorisation d'authentification dans Rails 6
Présentation de # 2 git et rubocop pour créer une API de tableau d'affichage avec autorisation d'authentification dans Rails
Introduction de l'expert n ° 15 pour créer une API de tableau d'affichage avec certification et autorisation dans Rails 6
Créez une API de tableau d'affichage avec certification et autorisation dans Rails 6 # 17 Ajoutez des privilèges d'administrateur
Construire une API de tableau d'affichage avec certification et autorisation dans Rails 6 # 14 Seed Affichage du temps d'exécution
# 16 paramètre de stratégie pour créer une API de tableau d'affichage avec autorisation de certification dans Rails 6
Implémentation n ° 8 pour créer une API de tableau d'affichage avec autorisation de certification dans Rails 6
Présentation du sérialiseur n ° 9 pour créer une API de tableau d'affichage avec certification et autorisation dans Rails 6
Créez une API de tableau d'affichage avec certification et autorisation dans Rails 6 # 6 show, créez une implémentation
Créer une API de tableau d'affichage avec autorisation de certification dans la mise à jour Rails 6 # 7, détruire l'implémentation
Comment créer une API avec GraphQL et Rails
J'ai essayé d'exprimer le numéro de téléphone (téléphone fixe / téléphone portable) avec une expression régulière dans Rails et d'écrire la validation et le test
J'ai essayé d'implémenter l'API Rails avec TDD par RSpec. part2 -authentification de l'utilisateur-
Comment renommer un modèle avec des contraintes de clé externes dans Rails
J'ai essayé de créer une fonction de groupe (babillard) avec Rails
Créez un environnement de test d'application Windows avec Selenium Grid, Appium et Windows Application Driver
[Rails 6] Enregistrez-vous et connectez-vous avec l'authentification Devise + SNS (plusieurs liens sont autorisés)
[Rails] Code de test unitaire pour le modèle utilisateur
[Ruby on Rails] Test de modèle avec RSpec
Comment stocker simultanément des données dans un modèle associé à une forme imbriquée (Rails 6.0.0)