2017-08-01 93 views
0

我正在使用proxyquire庫,它在導入時嘲諷軟件包。要求不按預期運行

我創造我自己的proxyquire功能,存根各種我經常使用的,並希望定期存根(流星包,裏面有專門的進口語法)包:

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

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

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

export default myProxyquire; 

現在我想寫一個使用這些程序包中的一個文件的測試:

// 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'; 
}; 

最後,我測試它像這樣:

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

請注意,我的最後2個文件嵌套在子文件夾src內。因此,當我嘗試運行此測試時,出現錯誤,說明無法找到模塊./foo,因爲正在按照預期在「根」目錄中查找myProxyquire.js文件,而不是src目錄。

+1

如果你用普通的require代替了'proxyquire',你會遇到同樣的問題,因爲'require'是這樣工作的:它加載相對於文件的文件_that包含對'require'的調用。 _,在你的情況下是'myProxyquire.js' – robertklep

+0

這就是我想的,有沒有辦法解決這個問題? –

回答

1

您可能能夠通過使用一個模塊一樣caller-path確定從哪個文件myProxyquire被調用,並傳遞路徑相對於文件解決若要解決(預計)的行爲:

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

然而,我不知道這與import(和推測,transpilers)的作品。