2017-10-14 8 views
1

Dans mon serveur nodejs, je voudrais me moquer de fs pour mon test avec Mocha. Je finis par utiliser Mockery, mais j'ai vraiment mal compris un concept.Mock fs module en utilisant la moquerie

Dans mon test (j'utilise Tapuscrit aussi):

// mock for fs 
var fsMock = { 
    readdir: (path: string) => { return { err: undefined, files: [] } }, 
    writeFile: (path: string, content: string, encoding: string) => { return { err: undefined } }, 
    readFileSync: (path: string, encoding: string) => { return "lol" } 
}; 
Mockery.registerMock('fs', fsMock); 


beforeEach((done) => { 
    Mockery.enable({ 
    useCleanCache: true, 
    warnOnReplace: false, 
    warnOnUnregistered: false 
    }); 
} 

afterEach(() => { 
Mockery.disable(); 
}); 

mais malheureusement lors de mon test, mon module utilise toujours l'ancien fs. J'ai compris pourquoi ne travaille pas. En effet, sur mon test, je:

  • importer mon module en haut du fichier
  • que j'importer le module, mon module importera ses dépendances, comme fs.
  • comme à ce moquerie temps n'est pas encore activé (nous ne sommes toujours pas en cours d'exécution d'un test ...), les fs importées dans mon module est l'original d'un
  • Je moquerie de configuration avant mon test
  • J'exécute mes test, qui échouent car est toujours le fs original qui est utilisé ...

Maintenant la question est: comment puis-je dire à mon module de re-exiger ses dépendances pour utiliser ma version moqueuse de fs? Et plus globalement, comment je peux me moquer facilement des fs?

Merci.

+0

L'astuce consiste à exiger le module que vous testez APRÈS avoir configuré le faux. –

+0

Aussi, je pense que vous devez d'abord activer Mockery, avant d'enregistrer un simulacre –

+0

J'utilise l'importation et cela ne peut être utilisé en haut du fichier :( – Adavo

Répondre

2

Enfin, après les tests et les tests, j'ai fini par ne pas utiliser mockery, mais SinonJS à la place. Il fournit un moyen très facile et sans effort pour simuler fs, par exemple. :

import * as Fs from "fs" 
import * as Sinon from "sinon" 

// .. 
// At a place inside a test where the mock is needed 
Sinon.stub(Fs, "readdir").callsFake(
    (path: string, callback: Function) => { callback(null, ['toto']) } 
);