Import von Modellen oder Komponenten aus einem Plugin in ein benutzerdefiniertes Plugin: Tests schlagen fehl

Hallo,
wir verwenden Discourse Version 3.5.0.
Wir haben unser eigenes Plugin, in dem wir verschiedene Discourse-Elemente überschreiben und eigene Funktionen hinzufügen.

In diesem Plugin möchten wir insbesondere das Symbol zum Hinzufügen eines Ereignisses zur Symbolleiste des Komponisten hinzufügen. Dazu müssen wir Folgendes importieren:

  • das Modell DiscoursePostEventEvent, das sich unter plugins/discourse-calendar/assets/javascripts/discourse/models/discourse-post-event-event.js befindet

  • die Komponente PostEventBuilder, die sich unter plugins/discourse-calendar/assets/javascripts/discourse/components/modal/post-event-builder.js befindet

Darüber hinaus haben wir Integrationstests für unsere Funktionen geschrieben, die wir in unserem Plugin unter dem Verzeichnis /test abgelegt haben.

import { visit } from "@ember/test-helpers";
import { test } from "qunit";
import { acceptance } from "discourse/tests/helpers/qunit-helpers";

acceptance("TOTO", function (needs) {
  test("coopaname integration - composer", async function (assert) {
    await visit("/");
    assert.equal(1, 1, "OK");
  });
});

Wir schaffen es, das zu tun, was wir wollen, aber die Tests schlagen fehl, unabhängig von der Importmethode.

Import am Dateianfang

Wenn wir unsere Modelle und Komponenten über die import-Methode am Dateianfang importieren:

import DiscoursePostEventEvent from "discourse/plugins/discourse-calendar/discourse/models/discourse-post-event-event";
import PostEventBuilder from "discourse/plugins/discourse-calendar/discourse/components/modal/post-event-builder";

Beim Ausführen ist alles in Ordnung, aber wenn wir unseren Test starten, wird er nicht ausgeführt.

Require am Dateianfang

Wenn wir unsere Modelle und Komponenten über die require-Methode am Dateianfang importieren:

const DiscoursePostEventEvent = require("discourse/plugins/discourse-calendar/discourse/models/discourse-post-event-event").default;
const PostEventBuilder = require("discourse/plugins/discourse-calendar/discourse/components/modal/post-event-builder".default;

Beim Ausführen ist alles in Ordnung, aber wenn wir unseren Test starten, wird er nicht ausgeführt.

Dies führt zum gleichen Ergebnis wie bei import.

Require im Dateikörper

Wenn wir unsere Modelle und Komponenten über die require-Methode im Körper der Funktion importieren:

import { withPluginApi } from "discourse/lib/plugin-api";

function initializeEventBuilder(api) {
  const DiscoursePostEventEvent =
     require("discourse/plugins/discourse-calendar/discourse/models/discourse-post-event-event").default;
  const PostEventBuilder =
     require("discourse/plugins/discourse-calendar/discourse/components/modal/post-event-builder").default;

  ... Rest des Codes
}

export default {
  name: "add-custom-create-event-button",
  initialize(container) {
    withPluginApi(initializeEventBuilder);
  },
};

Beim Ausführen ist alles in Ordnung, aber wenn wir unseren Test starten, schlägt er fehl.

Das Modell wurde nicht gefunden.

Kurz gesagt, wir möchten wissen, wie man Modelle, Komponenten usw. korrekt aus anderen Plugins importiert, damit wir die Integrationstests ausführen können.
Vielen Dank!

2 „Gefällt mir“

Hallo @Marine

Es scheint, dass das Problem in den falschen Einstellungen im needs.settings-Block unseres Codes liegt:

acceptance("Einige Tests", function (needs) {
  needs.settings({
    // Dies aktiviert nicht die richtigen Einstellungen, sodass das Kalender-Plugin nicht geladen wird und die benötigten Dateien nicht verfügbar sind
    // discourse_post_event_enabled: true, 
    // 
    // Die Aktivierung des Kalenders wird das Problem lösen:
    calendar_enabled: true

    our_plugin_enabled: true
  });


  test("Der Test", async function (assert) {
    await visit("/");
    assert.equal(1, 1);
  });
});

Nun, das stimmt nicht. Da das Plugin das Ereignisformular überschreibt, müssen wir discourse_post_event_enabled auf true setzen. Zurück zur ursprünglichen Situation, in der der Import in unserem Plugin fehlschlägt.

Irgendwelche Ideen?

Wenn Sie ein Plugin in QUnit testen, laden wir nur das JS für dieses spezielle Plugin. Dies hilft, unerwartete Probleme zu vermeiden, wenn mehrere Plugins miteinander interagieren. Es hilft auch sicherzustellen, dass ein Plugin nicht unerwartet von einem anderen abhängig wird.

In Ihrem Fall scheint die Interaktion beabsichtigt zu sein, und Sie erwarten immer, dass Ihre Benutzer discourse-calendar aktiviert haben. In diesem Fall können Sie eine Konfiguration zu einer about.json-Datei hinzufügen, die das discourse-calendar JS in den Tests Ihres eigenen Plugins verfügbar macht. Hier ist ein Beispiel:

^^ In diesem Fall wird discourse-assign hinzugefügt. In Ihrem Fall wäre es discourse-calendar.

4 „Gefällt mir“

Danke! Ich wusste nichts von about.json und es hat das Problem gelöst. Jetzt liegt es an uns, einen voll funktionsfähigen Kontext neu zu erstellen :wink:

Nochmals danke!

2 „Gefällt mir“

Sie sind vielleicht auch an Systemanforderungen für End-to-End-Tests interessiert. Auf diese Weise wird der Test gegen einen echten Discourse-Server ausgeführt, sodass Sie nicht alle Netzwerkanfragen für den Kern und beide Plugins fälschen müssen.

Der Nachteil ist, dass sie viel langsamer sind. Es ist also am besten, alle Unit-/Komponententests in qunit zu belassen, wenn Sie können.

2 „Gefällt mir“

Danke für den Tipp!

Ich bin mit System-Specs eigentlich vertrauter, da ich normalerweise RSpec oder Cucumber verwende, um meine Rails-Anwendungen zu testen :slight_smile:

Ich werde sehen, was sich mit QUnit oder RSpec lohnt zu testen, abhängig vom Testfall.

Vorerst habe ich den Frontend-Bug, den wir beheben wollten, reproduzieren können, also werde ich mich etwas mehr mit QUnit-Tests beschäftigen.

2 „Gefällt mir“