Wir haben ein NodeJS-App-Typescript geschrieben. Wir verwenden Module, um mehrere Funktionen, nicht Objekte zu exportieren.Bewährte Methode für das Mocking von Modulexporten in Typescript & NodeJS
Sobald wir diese Funktionen während der Prüfung verspotten wollen, verwenden wir mock-require
jedoch der Code sehr hässlich macht. Da wir im Grunde brauchen
- Import
mock-require
- unsere Mocks und Spione bauen
import {functionA,FunctionB} from "module-to-test"
mock.reRequire("module-to-test")
Der Code sieht ein bisschen wie folgt aus:
// mocking require imports
import * as mock from "mock-require";
import {getMockUserObject} from "../../test/utils/mock-objects";
const user = getMockUserObject();
let userModelSpy;
// mock userModel
userModelSpy = jasmine.createSpyObj("userModelSpy", ["findOne"]);
userModelSpy.findOne.and.returnValue(Promise.resolve(user));
mock("../data-source/mongo-data-source", {userModel: userModelSpy});
// actual import statements
import {functionA,FunctionB} from "module-to-test";
// reRequire the module that we want to test
mock.reRequire("./mail.service");
Gibt es eine Möglichkeit, dies nicht so hässlich zu machen? Z.B. Halten Sie die Importe zusammen. Wenn wir das Mocking in ein Vorheriges oder allgemein unter den Import des eigentlichen Modul-zu-Test verschieben, funktioniert das ReRequire nicht oder zumindest unsere Mocks werden nicht aufgerufen. Daher verwendet das zu testende Modul die tatsächlichen Abhängigkeiten anstelle der gespielten.
Danke für die Eingabe!
Hallo Mingos. Ich kenne diesen Ansatz von eckig. Aber was, wenn man keine Klassen benutzen will, da es einfach eine Reihe von Funktionen ist (z.B. Router in Express). Ich denke, hinter den Kulissen sind Klassen nur Funktionen, es sollte auch möglich sein, dies zu tun. – pascalwhoop
Ich kenne die Antwort darauf nicht. Persönlich teste ich die Integrationstester eher als Unit. – mingos