Test fallito: sign_in(Fabricate(:user))

Ho uno spec che ha iniziato a fallire qualche giorno fa. Sembra che il problema sia legato al fuso orario? Non vedo come possa essere colpa del mio plugin, ma forse mi sto perdendo qualcosa?

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
Esecuzione di Rspec: plugins/discourse-topic-default-tag/spec/requests/actions_controller_spec.rb
Caricamento dei plugin durante l'esecuzione degli spec

Si è verificato un errore durante il caricamento di ./plugins/discourse-topic-default-tag/spec/requests/actions_controller_spec.rb.
Failure/Error: UserOption.create!(user_id: id)

NoMethodError:
  metodo `timezone' non definito per #<UserOption:0x000055dd7af16ca8>
  Forse intendevi:  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)>'
Nessun esempio trovato.


Completato in 0,00005 secondi (i file hanno impiegato 3,52 secondi per essere caricati)
0 esempi, 0 fallimenti, 1 errore verificatosi al di fuori degli esempi

Sembra che manchi la colonna del fuso orario nella tua tabella user_options. Hai eseguito le migrazioni di recente nel tuo database di test? RAILS_ENV=test bin/rake db:migrate

Eh, no! No, non l’ho fatto. Ho eseguito le migrazioni sul database di sviluppo, ma non su quello di test. Grazie, David!

Non capisco cosa stia succedendo ora, ma probabilmente non è un problema così da principiante. :wink:

Dovresti ricevere un messaggio quando mancano le migrazioni

Ma questo funzionerà solo se stai utilizzando rails_helper. Sospetto che tu debba aggiungere require "rails_helper" all’inizio del tuo file spec. Questo potrebbe risolvere anche gli altri problemi che stai riscontrando.

Modifica: hmm… forse dovremmo aggiungere --require rails_helper al file .rspec in modo che non sia necessario aggiungerlo manualmente :thinking:

Sembra proprio quel tipo di errore stupido che potrei commettere io! Purtroppo, però, ho require 'rails_helper'.

Forse il problema era eseguire ./bin/rake autospec invece di bundle exec rake autospec, ma continua a fallire su Travis e ora questo spec sembra fare un sacco di cose che non capisco per il mio piccolo spec, ma aspetterò e vedrò cosa succede.

Grazie ancora.

Sto riscontrando un problema con la funzione di aiuto sign_in, qualsiasi aiuto sarebbe molto apprezzato! :exploding_head: :

Quando utilizzata in questo test, non sembra restituire un current_user e fallisce con un errore 403 (invece di un 200)

Sto eseguendo il test in questo modo per isolare il problema, ma non funziona in nessun caso:

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

Se aggiungo un byebug nel controller corrispondente e controllo current_user, questo è nil (da cui il 403, immagino!):

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

C’è un sopra che crea quell’utente? (Non sono abbastanza bravo da ricordare come si chiama o esattamente come si fa. Ah, un fabbricatore, forse. Hai fabbricato quell’utente?

(O forse non l’ho visto, dato che sono sul telefono)

Sì, l’utente è stato creato correttamente. L’oggetto utente è istanziato. Il problema è nel metodo sign_in o legato all’ambiente? (Ma questo dovrebbe essere controllato)

Dopo ulteriori indagini, ho rilevato quanto segue:

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

@env.key?(CURRENT_USER_KEY) è true

quindi current_user assume il valore di @env[CURRENT_USER_KEY]

Tuttavia, il suo valore è nil quando questa riga viene chiamata dal mio controller durante l’esecuzione di un test:

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

    raise Discourse::InvalidAccess.new unless current_user

Non sono sicuro del motivo per cui @env[CURRENT_USER_KEY] risulti nil dopo aver effettuato l’accesso di un utente all’interno dello spec?

Ho notato che durante l’esecuzione del test current_user viene chiamato più volte all’interno di un singolo test e, in un certo punto, questo attributo ha un valore, ma non in ogni chiamata e non quando è realmente necessario.

Hai installato altri plugin che potrebbero interferire con l’oggetto current_user? Ho clonato discourse-follow e quella specifica funziona per me:

❯ 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, grazie per la verifica, David! Allora deve essere qualcosa di particolare nel mio ambiente di sviluppo!

No, non ci sono altri plugin installati (a parte quelli in bundle e data explorer), ma dato che funziona per te, sono ispirato a configurare una nuova istanza Docker pulita per lo sviluppo e vedere se riesco a farla funzionare con successo lì. Grazie! :beers:

Sì, ho lavorato su docker dev:

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

grazie!!