2017-01-11 3 views
3

Ich habe ein TypeScript-Modul (sollte irrelevant sein, da ich denke, dass dies auch JS betrifft) und ich versuche, ein Modul zu testen, das ich habe. Das Modul importiert viele Daten aus externen Dateien und wählt anhand der a-Variablen aus, welche Daten zurückgegeben werden sollen.Jest - Testmodul mehrere Male in einer Test-Suite

Ich versuche, einige Tests auszuführen, in denen ich diese Variable aktualisiere, und das weitere Modul in einer Datei ausführe. Aber mein Problem ist, dass die der Datei nur einmal ausgeführt wird. Ich denke, es wird zwischengespeichert. Ist es möglich, Jests -Funktion mitzuteilen, den Cache zwischen den Tests nicht zwischenzuspeichern oder zu löschen?

Hier einige abisoliert Code von dem, was ich versuche zu erreichen:

module.ts

import { getLanguage } from "utils/functions"; 

import * as messagesEn from "resources/translations/en"; 
import * as messagesFr from "resources/translations/fr"; 

// Determine the user's default language. 
const language: string = getLanguage(); 

// Set messages based on the language. 
let messages: LocaleMessages = messagesEn.default; 
if (languageWithoutRegionCode === "fr") { 
    messages = messagesFr.default; 
} 

export { messages, language }; 

test.ts

import "jest"; 

// Mock the modules 
const messagesEn = { "translation1": "English", "translation2": "Words" }; 
const messagesFr = { "translation1": "Francais", "translation2": "Mots" }; 
const getLangTest = jest.fn(() => "te-ST"); 
const getLangEn = jest.fn(() => "en-GB"); 
const getLangFr = jest.fn(() => "fr-FR"); 
jest.mock("resources/translations/en",() => ({"default": messagesEn})); 
jest.mock("resources/translations/fr",() => ({"default": messagesFr})); 
jest.mock("utils/functions",() => ({ 
     getLanguage: getLangTest 
    }) 
); 

describe("Localisation initialisation",() => { 
    it("Sets language",() => { 
     const localisation = require("./localisation"); 
     expect(getLangTest).toHaveBeenCalled(); 
     expect(localisation.language).toEqual("te-ST"); 
     expect(localisation.messages).toEqual(messagesEn); 
    }); 

    it("Sets english messages",() => { 
     // THIS GETS THE MODULE FROM THE CACHE 
     const localisation = require("./localisation"); 
     expect(getLangEn).toHaveBeenCalled(); 
     expect(localisation.language).toEqual("en-GB"); 
     expect(localisation.messages).toEqual(messagesEn); 
    }); 

    it("Sets french messages",() => { 
     // THIS GETS THE MODULE FROM THE CACHE 
     const localisation = require("./localisation"); 
     expect(getLangFr).toHaveBeenCalled(); 
     expect(localisation.language).toEqual("fr-FR"); 
     expect(localisation.messages).toEqual(messagesFr); 
    }); 
}); 

Ich bin mir bewusst, der zweite und der dritte Tests werden sowieso nicht funktionieren, da ich den "utils/functions" Mock aktualisieren müsste. Das Problem ist, dass der Code in module.ts nur einmal ausgeführt wird.

Antwort

8

Also, vielen Dank an die Jest Leute auf Discord. Es ist möglich, die Module mit der Funktion jest.resetModules() aus dem Cache zu löschen.

So sieht meine test.ts Datei wie folgt:

describe("Localisation initialisation",() => { 
    beforeEach(() => { 
     jest.resetModules(); 
    }); 

    it("Sets language",() => { 
     const localisation = require("./localisation"); 
     // Perform the tests 
    }); 

    it("Sets english messages",() => { 
     const localisation = require("./localisation"); 
     // Perform the tests 
    }); 

    it("Sets french messages",() => { 
     const localisation = require("./localisation"); 
     // Perform the tests 
    }); 
}); 

Der beforeEach() Aufruf jest.resetModules() stellt sicher, wir sind erneut ausführen Sie den Code in das Modul.

+2

Vielen Dank für die gemeinsame Nutzung dieser Lösung! Es ist genau das, was ich brauchte. – Aaron

+1

Noch viel später relevant - danke! – fl0shizzle