2017-06-29 2 views
0

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

  1. Import mock-require
  2. unsere Mocks und Spione bauen
  3. import {functionA,FunctionB} from "module-to-test"
  4. 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!

Antwort

1

Mocking kann ein Problem mit ES6-Modulen sein und TypeScript hat das gleiche Problem. Ich habe einen anderen Ansatz gewählt: Anstatt tatsächliche Importe zu verspotten, benutze ich Konstruktorinjektion. Auf diese Weise können alle Mocks in die getestete Einheit injiziert werden.

Hier ist ein Beispiel:

import {someDependency} from "./someDependency"; 

export class Unit { 
    private someDependency; 
    constructor(someDependency) { 
     this.someDependency = someDependency; 
    } 
} 

Und der Unit-Test:

import {Unit} from "./Unit"; 

const mock: any =() => {}; 
const unit = new Unit(mock); 

Auf diese Weise brauche ich gar nicht in den Unit-Tests, die Einfuhren für die Abhängigkeiten zu haben.

Es gibt andere Ansätze, aber bis jetzt habe ich gefunden, dass dies der sauberste ist.

Hinweis: Annotieren der Mocks mit any weist TypeScript an, sie trotz nicht übereinstimmender Typen im Konstruktor zuzulassen.

+0

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

+0

Ich kenne die Antwort darauf nicht. Persönlich teste ich die Integrationstester eher als Unit. – mingos

Verwandte Themen