Depuis que j'ai implémenté une application de copie d'un certain site frima, j'écrivais un code de test unitaire du contrôleur comme une pratique, mais l'erreur suivante s'est produite sur le terminal au moment de l'exécution.
Terminal
bundle exec rspec spec/requests/items_spec.rb
~Omission~
1) ItemsController GET #Lorsque vous demandez l'action d'indexation d'index, la réponse est renvoyée normalement.
Failure/Error: expect(response.status).to eq 200
expected: 200
got: 401
(compared using ==)
# ./spec/requests/items_spec.rb:20:in `block (3 levels) in <top (required)>'
~Omission~
Ruby 2.6.5 Rails 6.0.3.3 MySQL Visual Studio Code (Caprybara,Rspec,GoogleChrome)
Un modèle d'erreur indiquant que l'état HTTP est 401 (non accessible) lors de l'accès à root_path. Cette application a introduit ** l'authentification de base **, et je m'attendais à ce qu'elle soit liée.
Il s'agit d'un mécanisme d'authentification des utilisateurs fourni dans la norme de communication HTTP, et c'est l'une des méthodes simples qui peuvent restreindre l'accès aux sites Web. Des utilisateurs et des mots de passe prédéfinis pouvant communiquer avec le serveur afin que seuls les utilisateurs qui les correspondent puissent utiliser l'application Web.
【Exemple d'image】 Lorsque j'ai vérifié avec la déclaration d'erreur ci-dessus et l'authentification de base, il y a eu des cas où l'authentification de base n'a pas réussi pendant le test. Sur la base de l'article de référence (posté à la fin de l'article), j'ai essayé de réussir à passer le nom d'utilisateur et le mot de passe d'authentification de base à la demande lors du test.
Se battre avec un mentor pendant environ 2 heures ... J'ai essayé différentes méthodes basées sur l'article de référence, mais l'erreur n'a pas été résolue. ~~ Et quand le mentor a enquêté ... ** "À partir de 2020, la certification de base pendant les tests n'est pas recommandée" **. ~~
Quel bordel ...!
La politique de résolution des erreurs consiste à "passer l'authentification de base au moment du test" Changé en "Ne pas effectuer d'authentification de base sauf dans l'environnement de production (pendant les tests)".
application_controller.rb
class ApplicationController < ActionController::Base
before_action :basic_auth if Rails.env.production? #Branche pour ne pas effectuer d'authentification de base lors des tests
private
def basic_auth
authenticate_or_request_with_http_basic do |username, password|
username == 'username' && password == 'password'
end
end
end
J'ai ajouté ** if Rails.env.production? ** à before_action afin qu'il ne s'applique que dans l'environnement de production. Grâce à cela, vous pouvez désormais accéder à la première page et exécuter le test sans authentification de base pendant le test!
Comme je suis encore un débutant, lorsque je suis confronté à une erreur, j'ai tendance à essayer de résoudre le problème de front. Comme cette fois, je me suis rendu compte qu'il est important de penser sous différents angles s'il existe un moyen d'éviter les erreurs et de "ne pas avoir à le faire" **.
Cet article était le premier message. J'espère que cela vous aidera. Merci d'avoir parcouru jusqu'au bout.
Qu'est-ce que la certification de base? Méthode de réglage et précautions - Explication de la cause de l'erreur [Stumbled on Rails x Authentification de base x Rspec](https://doruby.jp/users/hello_rails/entries/Rails%C3%97Basic%E8%AA%8D%E8%A8%BC%C3%97Rspec%E3 % 81% A7% E3% 81% A4% E3% 81% BE% E3% 81% A5% E3% 81% 84% E3% 81% 9F) Test des actions avec l'authentification BASIC dans RSpec3 Test Pass Rails / Rspec avec authentification de base http Comment écrire du code de test avec la certification de base
2020/10/25 Veuillez signaler et apporter les corrections suivantes.
――Comme pour la non-recommandation, je n'ai entendu que verbalement et la source est incertaine, j'ai donc ajouté une ligne d'annulation. (J'espère que vous pouvez y penser comme "il y a une telle rumeur".)
Merci, @jnchito.
Recommended Posts