2017-08-01 3 views
0

私はimportでmocksパッケージである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の中にネストされています。だから私がこのテストを実行しようとすると、ファイルが "root"ディレクトリで検索されているので、モジュール./fooが見つかりませんでしたというエラーが表示され、srcディレクトリが予想通りに見つかりませんでした。

+1

あなたが 'proxyquire'への呼び出しを通常の' require'に置き換えた場合、 'require'の仕方で同じ問題が発生します:' require'への呼び出しを含むファイルに対してファイルを読み込みます_、あなたの場合は 'myProxyquire.js' – robertklep

+0

これも私が思ったことです、これを回避する方法はありますか? –

答えて

1

あなたは、ファイルmyProxyquireが呼び出されたかを決定するためにcaller-pathのようなモジュールを使用して、そのファイルに渡された相対パスを解決することにより、その(予想される)現象を回避することができるかもしれない。しかし、

'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)で動作するのか分かりません。

関連する問題