要求不要按预期行事

时间:2017-08-01 12:47:45

标签: javascript testing meteor proxyquire

我使用的是proxyquire库,它会在导入时模拟软件包。

我正在创建自己的proxyquire函数,它会存储我经常使用的各种软件包,并且需要定期存根(meteor软件包,它们具有特殊的导入语法):

// 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,因为它正在" root"中查找。目录,myProxyquire.js文件所在的目录,而不是预期的src目录。

1 个答案:

答案 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(并且可能是转发器)。