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
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
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.
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)
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!