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