我有一个config.ts
将与节点一起运行的 TypeScript 文件:
import myDependency = require('my-dependency');
export = {
doSomething = () => {
...
}
}
在其他 TypeScript 文件中,我可以import
使用完全类型安全的文件:
import config = require('./config');
config.doSomething();
config.doSomethingElse(); // compiler error, this method doesn't exist
现在我想对这个脚本进行单元测试。为了模拟这个脚本require()
的依赖关系,我正在使用proxyquire,它让我可以提供我的脚本在调用require()
. 这是我的测试可能的样子:
import proxyquire = require('proxyquire');
const config = proxyquire('./config', {
'my-dependency': {} // this mocked object will be provided when config.ts asks for `my-dependency`
});
expect(config.doSomething()).to.do.something();
这很好用,除了我的config
变量是类型的any
,因为我使用proxyquire()
的是require()
. TypeScript 必须对require()
函数进行特殊处理以允许它执行模块解析。有没有办法告诉 TypeScript 编译器也proxyquire()
应该进行模块解析,类似于require()
?
我可以重写config.ts
为一个类或让它使用一个接口。然后,我将能够通过导入类/接口定义在我的测试中显式键入变量。但是允许proxyquire()
为我隐式输入内容将是更容易的解决方案。