[RUBY] [Pour les débutants] Testez l'enregistrement des utilisateurs avec RSpec

introduction

J'ai introduit la devise, mais je ne peux pas écrire le premier test ...! Je n'avais pas toutes les informations sur la façon de l'écrire, alors j'ai essayé de le résumer moi-même. Pour les débutants qui ont commencé à créer leurs propres applications.

Ruby '2.6.6' Rails '5.2.4'

1. Modifier Gemfile

Gemfile


group :development, :test do
・
・
  gem "rspec-rails"
  gem "factory_bot_rails"
end

Vers le Gemfile

Terminal


bundle install

Terminal



bundle install 
Fetching gem metadata from https://rubygems.org/............. 
Fetching gem metadata from https://rubygems.org/. 
・
・
Using duktape 2.3.0.0 
Fetching factory_bot 6.1.0 
Installing factory_bot 6.1.0 
Fetching factory_bot_rails 6.1.0 
Installing factory_bot_rails 6.1.0 
Using jbuilder 2.10.0
・
・
Using web-console 3.7.0 
Bundle complete! 22 Gemfile dependencies, 95 gems now installed. 
Use `bundle info [gemname]` to see where a bundled gem is installed.

Télécharger RSpec

Terminal


$ bundle exec rails generate rspec:install

2. Paramètres .rspec

Écrivez ce qui suit en .rspec.

rspec


--require spec_helper
--format documentation #Ajouter ici

La description ci-dessus peut être présente ou non, mais l'affichage lors de l'exécution du test change tellement avec ou sans lui.

Aucun

$ ...............................

Oui $ User $ #create $ is valid $ is invalid without email $ is invalid without password


 Source: Comment se connecter pour concevoir dans l'environnement de test rspec [rails]
https://qiita.com/Kohei_Kishimoto0214/items/e29e509b12a6eb484a42

### Je n'ai rien écrit, mais je vais essayer

 La commande à tester est
`bundle exec rspec`
 Alternativement, il peut être spécifié individuellement


#### **`Terminal`**
```ruby

bundle exec rspec
No examples found.


Finished in 0.00101 seconds (files took 3.71 seconds to load)
0 examples, 0 failures

Je n'ai pas encore décrit ce qu'il faut vérifier, mais il est affiché ...! !! !!

3. Définissez Factory_bot

Ajoutez la description suivante à la partie de configuration dans rails_helper.rb.

spec/rails_helper.rb


RSpec.configure do |config|
    config.includeFactoryBot::Syntax::Methods
end

Je pense que ça ressemblera à ça.

spec/rails_helper.rb


RSpec.configure do |config|
  # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
  config.fixture_path = "#{::Rails.root}/spec/fixtures"
  config.include FactoryBot::Syntax::Methods
  config.use_transactional_fixtures = true
  config.infer_spec_type_from_file_location!
  config.filter_rails_from_backtrace!
end

4. Paramètres de Rails_helper

Ensuite, la phrase suivante est commentée dans / spec / rails_helper.rb, donc veuillez la décommenter. Vous pouvez maintenant charger le fichier spec / support /.

/spec/rails_helper.rb


Dir[Rails.root.join('spec/support/**/*.rb')].each{|f|requiref}

/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'
# Add additional requires below this line. Rails is not loaded until this point!

# Requires supporting ruby files with custom matchers and macros, etc, in
# spec/support/ and its subdirectories. Files matching `spec/**/*_spec.rb` are
# run as spec files by default. This means that files in spec/support that end
# in _spec.rb will both be required and run as specs, causing the specs to be
# run twice. It is recommended that you do not name files matching this glob to
# end with _spec.rb. You can configure this pattern with the --pattern
# option on the command line or in ~/.rspec, .rspec or `.rspec-local`.
#
# The following line is provided for convenience purposes. It has the downside
# of increasing the boot-up time by auto-requiring all files in the support
# directory. Alternatively, in the individual `*_spec.rb` files, manually
# require only the support files necessary.
#
 Dir[Rails.root.join('spec', 'support', '**', '*.rb')].sort.each { |f| require f }Non commenté ici

# Checks for pending migrations and applies them before tests are run.
# If you are not using ActiveRecord, you can remove these lines.
begin
  ActiveRecord::Migration.maintain_test_schema!
rescue ActiveRecord::PendingMigrationError => e
  puts e.to_s.strip
  exit 1
end
RSpec.configure do |config|
  # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
  config.fixture_path = "#{::Rails.root}/spec/fixtures"
  config.include FactoryBot::Syntax::Methods
  

  # If you're not using ActiveRecord, or you'd prefer not to run each of your
  # examples within a transaction, remove the following line or assign false
  # instead of true.
  config.use_transactional_fixtures = true

  # You can uncomment this line to turn off ActiveRecord support entirely.
  # config.use_active_record = false

  # RSpec Rails can automatically mix in different behaviours to your tests
  # based on their file location, for example enabling you to call `get` and
  # `post` in specs under `spec/controllers`.
  #
  # You can disable this behaviour by removing the line below, and instead
  # explicitly tag your specs with their type, e.g.:
  #
  #     RSpec.describe UsersController, type: :controller do
  #       # ...
  #     end
  #
  # The different available types are documented in the features, such as in
  # https://relishapp.com/rspec/rspec-rails/docs
  config.infer_spec_type_from_file_location!

  # Filter lines from Rails gems in backtraces.
  config.filter_rails_from_backtrace!
  # arbitrary gems may also be filtered via:
  # config.filter_gems_from_backtrace("gem name")
end

5. Préparation des données d'essai

Créez un nouveau dossier et fichier spec \ factories \ user.rb

Cette fois, Faker n'est pas inclus, alors entrez les données manuellement. Il existe également un moyen d'attribuer des numéros de série, mais cette fois, nous utiliserons la méthode la plus simple.

Étant donné que le paramètre initial de l'appareil n'a pas de nom, seuls les trois éléments suivants sont requis. Si vous avez ajouté la colonne de nom, veuillez également ajouter l'élément de nom à spec \ factories \ user.rb.

spec\factories\user.rb


FactoryBot.define do
  factory :user do
    email                 {"[email protected]"}
    password              {"111111"}
    password_confirmation {"111111"}
  end
end

6. Créez controller_macros

Créez spec / support / controller_macros.rb et ajoutez le contenu officiel ci-dessous.

Officiel: Comment: tester les contrôleurs avec des rails (et RSpec) https://github.com/heartcombo/devise/wiki/How-To:-Test-controllers-with-Rails-(and-RSpec)

spec/support/controller_macros.rb


module ControllerMacros
  def login_admin
    before(:each) do
      @request.env["devise.mapping"] = Devise.mappings[:admin]
      sign_in FactoryBot.create(:admin) # Using factory bot as an example
    end
  end

  def login_user
    before(:each) do
      @request.env["devise.mapping"] = Devise.mappings[:user]
      user = FactoryBot.create(:user)
      user.confirm! # or set a confirmed_at inside the factory. Only necessary if you are using the "confirmable" module
      sign_in user
    end
  end
end

7. Chargez le dispositif et controller_macros dans rails_helper

Écrivez ce qui suit en dehors de RSpec.configure de rails_helper et chargez le dispositif et les macros.

spec/rails_helper.rb


require'devise'
requireFile.expand_path("spec/support/controller_macros.rb")

Écrivez ce qui suit dans RSpec.configure pour activer le test_helper et les macros de l'appareil dans le contrôleur.

spec/rails_helper.rb


RSpec.configure do |config|
・
・
 config.include Devise::Test::ControllerHelpers, type: :controller
  config.include Devise::Test::IntegrationHelpers, type: :request
  config.extend ControllerMacros, :type => :controller
・
・

Une fois ajouté, il ressemble à ceci.

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__)
abort("The Rails environment is running in production mode!") if Rails.env.production?
require 'rspec/rails'
require 'devise'
require File.expand_path("spec/support/controller_macros.rb")
require_relative 'support/controller_macros'

 Dir[Rails.root.join('spec', 'support', '**', '*.rb')].sort.each { |f| require f }


begin
  ActiveRecord::Migration.maintain_test_schema!
rescue ActiveRecord::PendingMigrationError => e
  puts e.to_s.strip
  exit 1
end
RSpec.configure do |config|
  # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
  config.fixture_path = "#{::Rails.root}/spec/fixtures"
  config.include FactoryBot::Syntax::Methods
  config.include Devise::Test::ControllerHelpers, type: :controller
  config.include Devise::Test::IntegrationHelpers, type: :request
  config.extend ControllerMacros, :type => :controller

 
  config.infer_spec_type_from_file_location!
  config.filter_rails_from_backtrace!

end

8. Dans user_spec.rb, créez un utilisateur et connectez-vous

L'utilisateur créé est stocké dans let et peut être utilisé comme une variable d'instance. Ensuite, laissez cet utilisateur se connecter pour concevoir en utilisant la méthode login_user.

Testez la validation du modèle. Veuillez définir la validation à l'avance.

require 'rails_helper'

RSpec.describe User, type: :model do describe 'Enregistrement de l'utilisateur' do it "nom, email, mot de passe et mot de passe_Si la confirmation existe, vous pouvez vous inscrire" do user = build(:user) expect(user).to be_valid # user.valid?Passer si c'est vrai end

end


Source: [Test avec Rspec ① (Test unitaire: Test de validation)] (https://misukeblog.com/rspec/) Source: [Test avec Rspec② (test d'intégration)] (https://misukeblog.com/rspec2/)

Après avoir écrit

Terminal


bundle exec rspec

Sortir

Devrait être! !! !! !! Ceci est terminé! !!

Terminal


$ bundle exec rspec
 
User
nom, email, mot de passe et mot de passe_Si la confirmation existe, vous pouvez vous inscrire
 
Finished in 0.5297 seconds (files took 9.34 seconds to load)
1 example, 0 failures

9. Je suis accro à

modèle 1

Terminal



& rails g rspec:model user
    conflict  spec/models/user_spec.rb
Overwrite C:/Users/deeep/techpitgram/spec/models/user_spec.rb? (enter "h"
for help) [Ynaqdhm]
                                        force  spec/models/user_spec.rb   for help) [Ynaqdhm]
$ bundle 


Migrations are pending. To resolve this issue, run:
 
        bin/rails db:migrate RAILS_ENV=test
No examples found.

Dans un tel cas, comme indiqué

Terminal


$ rails db:migrate RAILS_ENV=test

Faisons le

Motif 2

Si vous obtenez une erreur comme celle-ci, c'est une vieille gemme mélangée dans le fichier gem.

Terminal



$ bundle exec rspec
2020-09-02 22:36:39 WARN Selenium [DEPRECATION] Selenium::WebDriver::Chrom
e#driver_path= is deprecated. Use Selenium::WebDriver::Chrome::Service#dri
ver_path= instead.
 
An error occurred while loading ./spec/models/user_spec.rb.
Failure/Error: require File.expand_path('../config/environment', __dir__)
 
Selenium::WebDriver::Error::WebDriverError:
per-2.1.1/bin/chromedriver-helper"
# ./config/application.rb:7:in `<top (required)>'

# ./config/environment.rb:2:in `<top (required)>'
# ./spec/rails_helper.rb:4:in `require'
# ./spec/rails_helper.rb:4:in `<top (required)>'
# ./spec/models/user_spec.rb:1:in `require'
# ./spec/models/user_spec.rb:1:in `<top (required)>'
No examples found.
 
 
Finished in 0.00008 seconds (files took 7.23 seconds to load)
0 examples, 0 failures, 1 error occurred outside of examples

Référence: Rspec ne fonctionne pas Chargement rails_helper https://teratail.com/questions/247938?link=qa_related_pc

Réécrivez le Gemfile.

Gemfile



group :test do
  # Adds support for Capybara system testing and selenium driver
  gem 'capybara', '>= 2.15'
  gem 'selenium-webdriver'
  # Easy installation and use of chromedriver to run system tests with Chrome
  #gem 'chromedriver-helper'  #Supprimer cette phrase ou commenter
  gem 'webdrivers', '~> 3.0' #Ajoutez cette ligne
  gem 'rspec-rails'
  gem "factory_bot_rails"
end
・
・

gem 'devise'

Et

Terminal


bundle install

Vous devriez pouvoir le faire!

finalement

Je vous serais reconnaissant de bien vouloir signaler toute erreur.

Diverses références

[Procédure d'installation de Rspec et Factory_bot dans l'application Rails] (https://qiita.com/Ushinji/items/522ed01c9c14b680222c)

[Test du système d'authentification RSpec pour débutant] (https://qiita.com/zongxiaojie/items/d488edd42ba3864859c7)

[Comment se connecter pour concevoir dans l'environnement de test rspec [rails]] (https://qiita.com/Kohei_Kishimoto0214/items/e29e509b12a6eb484a42)

[Test du contrôleur avec un appareil] (https://qiita.com/nysalor/items/ef3d658ff76bee165379)

[Remarques sur le test unitaire utilisant RSpec @TECH CAMP # 11-note] (https://note.com/ruquia7/n/n00ff04fc9129)

[[Ruby on Rails] Test unitaire du modèle utilisant rspec-note] (https://note.com/vixer93/n/n6ef6555d7a3e)

[À propos de l'erreur "bin / rails db: migrate RAILS_ENV = test" après la migration dans Rails] (https://teratail.com/questions/178462)

Recommended Posts

[Pour les débutants] Testez l'enregistrement des utilisateurs avec RSpec
concevoir l'enregistrement des utilisateurs
[Rails] Test avec RSpec
Testez Nokogiri avec Rspec.
Tester Active Strage avec RSpec
(Pour les débutants) [Rails] Installer Devise
Tester le résolveur GraphQL avec rspec
Construction d'environnement avec Docker pour les débutants
Copier et coller le test avec RSpec
[rails] Faisons un test unitaire avec Rspec!
[R Spec on Rails] Comment écrire du code de test pour les débutants par les débutants
6 points de doute lorsque l'enregistrement de l'utilisateur n'est pas possible avec l'appareil
[Rails] Code de test unitaire pour le modèle utilisateur
[Ruby on Rails] Afficher le test avec RSpec
Apprenez de «Et alors», les bases de Java [pour les débutants]
[Ruby on Rails] Test du contrôleur avec RSpec
[Ruby on Rails] Test de modèle avec RSpec
[Atelier pour débutants] Écrivons un test E2E avec Cloud9 + Docker Compose + Cypress!
[Swift / Pour les débutants] Écrivez intelligemment avec l'inférence de type
[Java] Comment tester s'il est nul dans JUnit
Utilisez [Rails] pour concevoir la fonction utilisateur invité (pour le portefeuille)
Les débutants de Rails ont essayé de se lancer avec RSpec
[RSpec] J'ai écrit un test pour télécharger une image de profil.
Pourquoi vous avez besoin d'une adresse e-mail pour l'enregistrement des utilisateurs
[À voir absolument pour les débutants] Compilez les paramètres avec IntellJ [Beaucoup d'images]
À propos du traitement du crud et des produits utilisant un appareil (pour les débutants)
Procédure de création du code de test unitaire RSpec (création de l'utilisateur de connexion Ver.)
Erreur de test Rails5 Rspec ArgumentError: Usine non enregistrée: utilisateur