2016-06-11 4 views
0

Ich schreibe Tests für mein NPM-Modul. Diese Tests erfordern die Installation mehrerer Versionen eines npm-Moduls, um zu überprüfen, ob das Modul sie als kompatibel oder inkompatibel validiert.Knoten require.cache Löschen führt nicht zum Neuladen des Moduls

Irgendwie alle uncache Bibliotheken oder Funktion, die ich auf Stackoverflow oder der npm Datenbank funktionieren nicht ..

I Installation/Deinstallation npm Module durch meine Helfer Funktionen:

function _run_cmd(cmd, args) { 
    return new Promise((res, rej) => { 
     const child = spawn(cmd, args) 
     let resp = '' 
     child.stdout.on('data', function (buffer) { 
      resp += buffer.toString() 
     }) 
     child.stdout.on('end', function() { 
      res(resp) 
     }) 
     child.stdout.on('error', (err) => rej(err)) 
    }) 
} 

global.helper = { 
    npm: { 
     install: function (module) { 
      return _run_cmd('npm', ['install', module]) 
     }, 
     uninstall: function (module) { 
      decacheModule(module) 
      return _run_cmd('npm', ['uninstall', module]) 
     } 
    } 
} 

Dies ist meine aktuelle decache Funktion, die alle Module Caches löschen sollte (ich versuchte, andere, darunter npm Module keiner von ihnen arbeitete)

function decacheModules() { 
    Object.keys(require.cache).forEach(function(key) { 
     delete require.cache[key] 
    }) 
} 

ich bin der Installation mehrere ve rsionen des weniger moduls (https://www.npmjs.com/package/less)

In meinem ersten Test installiere ich eine veraltete Version, die keine render-Funktion hat.

In einigen anderen Tests installiere ich eine aktuelle Version mit der render-Funktion. Irgendwie, wenn ich für diese Funktion teste, schlägt dieser Test fehl. Wenn ich den ersten Test überspringe, ist der andere Test erfolgreich. (render -Funktion existiert). keinen Einfluss hat ...

Ich bin mit Knoten V4.2.4

Das macht mich, dass das Löschen von require.cache glauben.

Antwort

0

Wenn es einen Verweis auf das alte Modul ist:

var less = require('less'); 

löschen Modul Cache nicht, dass das Bezugs führen gelöscht und das Modul neu zu laden. Damit das funktioniert, speichern Sie Modul nicht zu Variable, verwenden Sie das "require ('less')" an Ort und Stelle.

+0

Ich benötige Module mit einem benutzerdefinierten geschriebenen Resolver, der prüft, ob die Paketversion übereinstimmt, das Paket installiert ist usw. Ich habe versucht, jeden einzelnen Request auszumerzen, der einen Verweis auf das Modul enthalten könnte. Aber es funktioniert immer noch nicht ... Ich weiß nicht mehr, was ich tun soll. Ich könnte den Code des Tests und des getesteten Moduls (etwa 150 Zeilen Code) veröffentlichen – l0rin

Verwandte Themen