ruby 2.5.7 Rails 5.2.4.3 OS: macOS Catalina
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
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
① 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
...
Le contenu suivantRSpec.configure do |config|
Ajouter à.
spec/rails_helper.rb
RSpec.configure do |config|
...
config.include Devise::Test::IntegrationHelpers, type: :request # <--ajouter à
end
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.
[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
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