Fehlender Test: sign_in(Fabricate(:user))

Ich habe eine Spezifikation, die vor ein paar Tagen angefangen hat, fehlschlagen. Es sieht so aus, als läge es an etwas mit der Zeitzone? Ich sehe keine Möglichkeit, dass mein Plugin dafür verantwortlich ist, aber vielleicht übersehe ich etwas?

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
Rspec wird ausgeführt: plugins/discourse-topic-default-tag/spec/requests/actions_controller_spec.rb
Plugins werden beim Ausführen der Spezifikationen geladen

Beim Laden von ./plugins/discourse-topic-default-tag/spec/requests/actions_controller_spec.rb ist ein Fehler aufgetreten.
Fehler in der Ausführung: UserOption.create!(user_id: id)

NoMethodError:
  Die Methode `timezone' ist für #<UserOption:0x000055dd7af16ca8> nicht definiert.
  Gemeint war möglicherweise: 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)>'
Keine Beispiele gefunden.


Abgeschlossen in 0,00005 Sekunden (Dateien benötigten 3,52 Sekunden zum Laden)
0 Beispiele, 0 Fehler, 1 Fehler außerhalb der Beispiele aufgetreten

Das klingt so, als würde dir die Zeitzone-Spalte in deiner user_options-Tabelle fehlen. Hast du kürzlich Migrationen in deiner Testdatenbank ausgeführt? RAILS_ENV=test bin/rake db:migrate

Wieso, nein! Nein, habe ich nicht. Ich habe Migrations auf der Dev-Datenbank ausgeführt, aber nicht auf der Test-Datenbank. Danke, David!

Ich verstehe gerade nicht, was los ist, aber das Problem ist wahrscheinlich nicht so einfach, wie es scheint. :wink:

Sie sollten eine Meldung erhalten, wenn Ihnen Migrationen fehlen

Das funktioniert jedoch nur, wenn Sie den rails_helper verwenden. Ich vermute, Sie müssen require "rails_helper" an den Anfang Ihrer Spec-Datei hinzufügen. Das könnte auch die anderen Probleme lösen, die Sie feststellen.

Edit: Hmm … vielleicht sollten wir --require rails_helper zur .rspec-Datei hinzufügen, damit es nicht manuell hinzugefügt werden muss :thinking:

Das klingt nach einem dämlichen Fehler, den ich auch machen würde! Leider habe ich aber require 'rails_helper'.

Vielleicht lag es daran, dass ich ./bin/rake autospec statt bundle exec rake autospec ausgeführt habe, aber es schlägt immer noch bei Travis fehl. Und jetzt führt diese Spezifikation eine ganze Reihe von Aktionen aus, die ich für meine kleine Spezifikation nicht verstehe, aber ich warte einfach ab, was passiert.

Nochmals vielen Dank.

Ich habe ein Problem mit der sign_in-Hilfsfunktion. Jede Hilfe wäre sehr willkommen! :exploding_head: :

Wenn sie in diesem Test verwendet wird, scheint sie keinen current_user bereitzustellen und schlägt mit einem 403er-Fehler fehl (anstatt mit 200).

Ich führe den Test wie folgt aus, um ihn zu isolieren, aber es funktioniert auch so nicht:

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

Wenn ich im entsprechenden Controller ein byebug hinzufüge und nach current_user suche, ist dieser nil (daher der 403, nehme ich an!):

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

Hast du da oben ein , das diesen Benutzer erstellt? (Ich bin nicht gut genug, um mich daran zu erinnern, wie das heißt oder wie man es genau macht. Ach ja, ein Fabrikator, vielleicht. Hast du diesen Benutzer fabriziert?

(Oder vielleicht habe ich es nicht gesehen, da ich gerade am Handy bin))

Ja, der Benutzer ist erstellt. Das Benutzerobjekt wurde instanziiert. Das Problem liegt entweder in der sign_in-Methode oder hat etwas mit der Umgebung zu tun? (Aber das sollte kontrolliert werden)

Bei weiterer Untersuchung stelle ich Folgendes fest:

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

ist @env.key?(CURRENT_USER_KEY) true.

Somit nimmt current_user den Wert von @env[CURRENT_USER_KEY] an.

Allerdings ist der Wert nil, wenn diese Zeile während eines Testlaufs aus meinem Controller aufgerufen wird:

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

    raise Discourse::InvalidAccess.new unless current_user

Ich bin mir nicht sicher, warum @env[CURRENT_USER_KEY] nach der Anmeldung eines Benutzers innerhalb der Spezifikation nil sein sollte.

Mir fällt auf, dass current_user während des Testlaufs innerhalb nur eines Tests mehrfach aufgerufen wird. Zu einem Zeitpunkt hat dieses Attribut einen Wert, aber nicht bei jedem Aufruf und nicht, wenn es darauf ankommt.

Haben Sie weitere Plugins installiert, die das current_user-Objekt beeinträchtigen könnten? Ich habe discourse-follow geklont, und dieser Test läuft bei mir erfolgreich:

❯ 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, danke für die Überprüfung, David! Es muss also etwas Besonderes an meiner Dev-Umgebung geben!

Nein, es sind keine anderen Plugins installiert (außer den mitgelieferten und dem Data Explorer), aber da es bei dir funktioniert, bin ich inspiriert, eine frische, saubere Docker-Dev-Instanz einzurichten und zu prüfen, ob ich sie dort erfolgreich ausführen kann. Cheers! :beers:

Ja, habe an der Docker-Entwicklung gearbeitet:

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

Danke!!