要求不按预期行事
Require not behaving as expected
我正在使用 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
目录。
您可以通过使用 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
(而且,大概是转译器)。
我正在使用 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
目录。
您可以通过使用 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
(而且,大概是转译器)。