Échec du test : sign_in(Fabricate(:user))

J’ai une spécification qui a commencé à échouer il y a quelques jours. Il semble que cela soit dû à quelque chose concernant le fuseau horaire ? Je ne vois pas comment cela pourrait être la faute de mon plugin, mais peut-être que je passe à côté de quelque chose ?

require 'rails_helper'

describe TopicDefaultTag::ActionsController do
  before do
    Jobs.run_immediately!
  end

  it 'can list' do
    sign_in(Fabricate(:user))
    get "/topic-default-tag/list.json"
    expect(response.status).to eq(200)
  end
end
Exécution de Rspec : plugins/discourse-topic-default-tag/spec/requests/actions_controller_spec.rb
Chargement des plugins lors de l'exécution des spécifications

Une erreur s'est produite lors du chargement de ./plugins/discourse-topic-default-tag/spec/requests/actions_controller_spec.rb.
Erreur de méthode :
  undefined method `timezone' for #<UserOption:0x000055dd7af16ca8>
  Did you mean?  timeout
# ./app/models/user.rb:1343:in `create_user_option'
# (eval):19:in `block (2 levels) in run_file'
# ./spec/rails_helper.rb:79:in `<top (required)>'
# ./plugins/discourse-topic-default-tag/spec/requests/actions_controller_spec.rb:1:in `require'
# ./plugins/discourse-topic-default-tag/spec/requests/actions_controller_spec.rb:1:in `<top (required)>'
Aucun exemple trouvé.


Terminé en 0,00005 seconde (les fichiers ont pris 3,52 secondes à charger)
0 exemple, 0 échec, 1 erreur survenue en dehors des exemples

Cela ressemble à l’absence de la colonne timezone dans votre table user_options. Avez-vous exécuté les migrations récemment dans votre base de données de test ? RAILS_ENV=test bin/rake db:migrate

Pourquoi, non ! Non, je ne l’ai pas fait. J’ai exécuté les migrations sur la base de données de développement, mais pas sur celle de test. Merci, David !

Je ne comprends pas ce qui se passe actuellement, mais il est probable que ce problème ne soit pas aussi basique. :wink:

Vous devriez recevoir un message lorsque des migrations sont manquantes

Cependant, cela ne fonctionnera que si vous utilisez le rails_helper. Je soupçonne que vous devez ajouter require "rails_helper" en haut de votre fichier spec. Cela pourrait également résoudre les autres problèmes que vous rencontrez.

Édition : hmm… peut-être devrions-nous ajouter --require rails_helper au fichier .rspec afin qu’il ne soit plus nécessaire de l’ajouter manuellement :thinking:

Cela ressemble à l’erreur stupide que j’aurais pu faire ! Hélas, j’ai bien require 'rails_helper'.

Peut-être que l’exécution de ./bin/rake autospec plutôt que bundle exec rake autospec était le problème, mais cela échoue toujours sur Travis. Maintenant, cette spécification semble faire beaucoup de choses que je ne comprends pas pour ma petite spécification, mais je vais attendre et voir ce qui se passe.

Merci encore.

Je rencontre un problème avec la fonction d’aide sign_in, toute aide serait grandement appréciée ! :exploding_head: :

Lorsqu’elle est utilisée dans ce test, elle ne semble pas fournir de current_user et échoue avec une erreur 403 (au lieu d’un 200).

J’exécute le test de la manière suivante pour l’isoler, mais cela ne fonctionne pas non plus :

LOAD_PLUGINS=1 RAILS_ENV=test rspec plugins/discourse-follow/spec/requests/follow_controller_spec.rb:32

Si j’ajoute un byebug dans le contrôleur correspondant et que je vérifie current_user, il est nil (d’où le 403 je suppose !) :

Randomized with seed 50945

[5, 14] in /home/merefield/code/discourse-follow/app/controllers/follow/follow_controller.rb
    5:   def update
    6:     params.require(:username)
    7:     params.require(:follow)
    8:     byebug
    9:
= 10:     raise Discourse::InvalidAccess.new unless current_user
   11:     raise Discourse::InvalidParameters.new if current_user.username == params[:username]
   12:
   13:     if user = User.find_by(username: params[:username])
   14:       updater = Follow::Updater.new(current_user, user)
(byebug) current_user
nil

Avez-vous un ci-dessus qui crée cet utilisateur ? (Je ne suis pas assez doué pour me souvenir comment cela s’appelle ou comment faire exactement. Ah, un fabricant, peut-être. Avez-vous fabriqué cet utilisateur ?

(ou peut-être que je ne l’ai pas vu, car je suis sur mon téléphone)

Oui, l’utilisateur est créé. L’objet utilisateur est instancié. Le problème se situe dans la méthode sign_in ou dans l’environnement ? (Mais cela devrait être contrôlé)

Après investigation plus approfondie, je constate ce qui suit :

dans def current_user (discourse/lib/auth/default_current_user_provider.rb at 1472e47aae5bfdfb6fd9abfe89beb186c751f514 · discourse/discourse · GitHub)

@env.key?(CURRENT_USER_KEY) est true

donc current_user prend la valeur de @env[CURRENT_USER_KEY]

Cependant, sa valeur est nil lorsque cette ligne est appelée depuis mon contrôleur lors d’une exécution de test :

  def update
    params.require(:username)
    params.require(:follow)

    raise Discourse::InvalidAccess.new unless current_user

Je ne sais pas pourquoi @env[CURRENT_USER_KEY] serait nil après avoir connecté un utilisateur dans la spécification ?

Je remarque que lors de l’exécution du test, current_user est appelé plusieurs fois au cours d’un seul test, et à un moment donné, cet attribut a une valeur, mais pas à chaque appel, et pas au moment où cela compte.

Avez-vous d’autres plugins installés qui pourraient interférer avec l’objet current_user ? J’ai cloné discourse-follow et cette spécification fonctionne pour moi :

❯ LOAD_PLUGINS=1 bin/rspec plugins/discourse-follow/spec/requests/follow_controller_spec.rb  

Randomized with seed 28704
...

Finished in 0.45075 seconds (files took 3.34 seconds to load)
3 examples, 0 failures

Randomized with seed 28704

Ah, merci de l’avoir vérifié, David ! Cela doit donc être quelque chose de particulier à ma configuration de développement !

Non, il n’y a pas d’autres plugins installés (en dehors de ceux livrés par défaut et de l’explorateur de données), mais puisque cela fonctionne pour toi, cela m’inspire à configurer une nouvelle instance Docker de développement propre et à voir si je peux l’exécuter avec succès là-bas. Merci ! :beers:

Oui, ça a fonctionné sur le dev Docker :

d/rake plugin:spec["discourse-follow"]

Merci !!