2017-01-11 6 views
3

У меня есть модуль TypeScript (должен быть неактуальным, поскольку, как я думаю, это влияет на JS), и я пытаюсь протестировать модуль, который у меня есть. Модуль импортирует большое количество данных из внешних файлов и выбирает, какие данные должны быть возвращены на основе переменной.Jest - модуль тестирования несколько раз в одном тестовом наборе

Я пытаюсь запустить некоторые тесты, где я обновляю эту переменную, обновляю модуль и запускаю дополнительные тесты в одном файле. Но моя проблема в том, что файл require работает только один раз. Я предполагаю, что он кэшируется. Можно ли сообщить функции Jest require не кешировать или очистить кеш между тестами?

Вот некоторые раздели обратно код, что я пытаюсь достичь:

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); 
    }); 
}); 

Я знаю, второй и третий тесты не будут работать, так как мне нужно будет обновить макет "utils/functions". Проблема в том, что код в module.ts запускается только один раз.

ответ

8

Итак, большое спасибо джестным людям на Discord. Можно действительно очистить модули от кеша с помощью функции jest.resetModules().

Так что мой test.ts файл будет выглядеть следующим образом:

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 
    }); 
}); 

beforeEach() вызов jest.resetModules() гарантирует, что мы повторно запустить код в модуле.

+2

Спасибо, что поделились этим решением! Это то, что мне нужно. – Aaron

+1

По-прежнему актуально много времени спустя - спасибо! – fl0shizzle