2017-08-01 3 views
0

Ich verwende die Proxyquire-Bibliothek, die Pakete beim Import sperrt.Anforderung, die sich nicht wie erwartet verhält

Ich bin meine eigene proxyquire Funktion zu schaffen, die eine Vielzahl von Paketen Stümpfe ich regelmäßig und wollen regelmäßig (Meteor-Pakete, die eine spezielle Import Syntax) Stub:

// myProxyquire.js 
import proxyquire from 'proxyquire'; 

const importsToStub = { 
    'meteor/meteor': { Meteor: { defer:() => {} } }, 
}; 

const myProxyquire = filePath => proxyquire(filePath, importsToStub); 

export default myProxyquire; 

Jetzt möchte ich schreiben einen Test einer Datei, die eines dieser Pakete verwendet:

// src/foo.js 
import { Meteor } from 'meteor/meteor'; // This import should be stubbed 

export const foo =() => { 
    Meteor.defer(() => console.log('hi')); // This call should be stubbed 
    return 'bar'; 
}; 

Und ich es endlich testen wie folgt aus:

// src/foo.test.js 
import myProxyquire from '../myProxyquire'; 

// This should be looking in the `src` folder 
const { foo } = myProxyquire('./foo'); // error: ENOENT: no such file 

describe('foo',() => { 
    it("should return 'bar'",() => { 
    expect(foo()).to.equal('bar'); 
    }); 
}); 

Beachten Sie, dass meine letzten 2 Dateien in einem Unterordner src geschachtelt sind. Also, wenn ich versuche, diesen Test zu starten, bekomme ich eine Fehlermeldung, dass das Modul ./foo nicht gefunden werden konnte, da es im Verzeichnis "root" gesucht wird, wo die myProxyquire.js Datei ist, nicht das src Verzeichnis wie erwartet.

+1

Wenn Sie den Aufruf von 'proxyquire' durch ein reguläres' require' ersetzt haben, haben Sie das gleiche Problem, weil 'require' funktioniert: Es lädt Dateien relativ zu der Datei _die den Aufruf von' require' enthält _, das ist in deinem Fall 'myProxyquire.js' – robertklep

+0

Das ist, was ich auch dachte, gibt es einen Weg um dies? –

Antwort

1

Sie könnten in der Lage sein, um dieses (erwarteten) Verhalten zu arbeiten, indem ein Modul wie caller-path unter Verwendung von der myProxyquire Datei zu bestimmen, wurde genannt, und die Lösung des geben Pfad relativ zu dieser Datei:

'use strict'; // this line is important and should not be removed 

const callerPath   = require('caller-path'); 
const { dirname, resolve } = require('path'); 

module.exports.default = path => require(resolve(dirname(callerPath()), path)); 

jedoch Ich habe keine Ahnung davon arbeitet mit import (und vermutlich, transpilers).

Verwandte Themen