我使用inject-loader
来模拟要进行单元测试的Typescript项目的依赖项。我测试的服务有一个这样的导入行:
import pnp, { SearchQuery, Sort, SortDirection, CamlQuery } from "sp-pnp-js";
对于我的测试,我想模仿pnp上的几个函数,但保持类完好无损。在我的单元测试文件中,我已经包含了这个导入:
import { SearchQuery, Sort, SortDirection, CamlQuery } from "sp-pnp-js";
这使我的测试可以访问必要的类。我已经宣布了一个模拟服务对象:
// mock services
const mockPnp = {
default: { ... }
};
我已经连接到我的目标类实例:
Service = require("inject!./sharepointservice")({
"sp-pnp-js": mockPnp
}).Service;
一切正常,只要我不运行任何引用这些类的代码(即SearchQuery
)。为了实现这一点,我尝试将其添加到模拟中:
// mock services
const mockPnp = {
default: { ... },
SearchQuery: SearchQuery
};
但是,我收到'SearchQuery' only refers to a type, but is being used as a value here
错误。
我已尝试投射到any
(同样的错误),模块和导出技巧,没有运气。我应该能够使用Typescript编写任何Javascript,这在Javascript中可以轻松工作 - 我在这里缺少什么?
答案 0 :(得分:6)
根据definition file SearchQuery
是一个接口,这意味着您不能将其视为值(如错误消息所示)。
Typescript接口没有被编译到js输出中,你不能在运行时使用它们。
答案 1 :(得分:0)
从技术上讲,由于它只是为了类型安全,我可以做到这一点
t: MyInterface = {};