【发布时间】:2017-03-02 18:26:24
【问题描述】:
我有一个 TypeScript 文件 config.ts 将与节点一起运行:
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()s 的依赖关系,我正在使用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() 为我隐式输入内容将是更简单的解决方案。
【问题讨论】:
标签: node.js typescript proxyquire