ruby 2.5.7 Rails 5.2.4.3 OS: macOS Catalina
[Ruby on Rails] Jusqu'à l'introduction de RSpec Nous partirons du principe que cela est fait.
Cette fois, nous allons tester s'il existe une colonne de titre et le nombre de caractères.
app/models/post.rb
class Post < ApplicationRecord
belongs_to :user
validates :title, presence: true, length: {maximum: 20}
end
① Créer un dossier de modèles et un dossier d'usines selon les spécifications, Créez également un fichier pour le modèle que vous souhaitez tester. Cette fois, nous allons tester le modèle de poste. De plus, pour garantir que les utilisateurs ne peuvent publier que lorsqu'ils sont connectés, Créez également un modèle d'utilisation. La structure des fichiers est la suivante. spec/models/post_spec.rb → Décrivez ce que vous voulez tester
spec/factories/post.rb spec/factories/user.rb → Créer des données factices
② Vous permet d'utiliser FactoryBot. Il est pratique de l'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
...
Tout d'abord, créez des données factices.
spec/factories/user.rb
FactoryBot.define do
factory :user 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) }
user
end
end
Ensuite, écrivez le code de test.
spec/models/post_spec.rb
require 'rails_helper'
RSpec.describe 'Test post-modèle', type: :model do
describe 'Test de validation' do
#Utilisez les données factices créées par les usines.
let(:user) { FactoryBot.create(:user) }
let!(:post) { build(:post, user_id: user.id) }
# test_Créez un message et vérifiez si vous pouvez vous inscrire dans le vide.
subject { test_post.valid? }
let(:test_post) { post }
context 'colonne de titre' do
it 'Ne doit pas être vide' do
test_post.title = ''
is_expected.to eq false;
end
it 'Doit contenir 20 caractères ou moins' do
post.title = Faker::Lorem.characters(number:21)
expect(post.valid?).to eq false;
end
end
end
describe 'Associations de test' do
context 'Relation avec le modèle client' do
it 'N:Est 1' do
expect(Post.reflect_on_association(:user).macro).to eq :belongs_to
end
end
# has_Il est également décrit par de nombreuses relations.
# context 'Relation avec le modèle PostComment' do
# it '1:Est N' do
# expect(Post.reflect_on_association(:post_comments).macro).to eq :has_many
# end
# end
end
end
Ensuite, procédez comme suit dans votre terminal:
$ rspec spec/models
Si vous réussissez le test
Finished in 0.52408 seconds (files took 2.11 seconds to load)
3 examples, 0 failures
Comme il est affiché comme ceci, cela signifie que le contenu du test est correct.
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, et ainsi de suite.
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, validation pour empêcher l'enregistrement avec présence vide: vrai 2, validation de la longueur limite des caractères: {maximum: 20} 3, confirmation de la relation de relation appartient_to: utilisateur
J'ai testé ce qui précède, mais il existe de nombreuses autres méthodes de test, donc Si vous êtes intéressé, veuillez le vérifier.
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