使用 Mocha 和 Typescript 模拟依赖项

Posted

技术标签:

【中文标题】使用 Mocha 和 Typescript 模拟依赖项【英文标题】:Mock dependencies with Mocha and Typescript 【发布时间】:2016-10-27 06:51:33 【问题描述】:

我有一个使用 mocha 的打字稿项目。假设我们有如下两个模块。

// http.ts
export class Http 


// app.ts
import Http from './http';

export class App 


我在测试应用程序时如何模拟 Http 模块?

测试通过如下的 npm 脚本执行。

"test": "cross-env NODE_ENV=test ./node_modules/mocha/bin/mocha",

mocha 选项 (mocha.opts) 如下所示。

test/setup.ts
--compilers ts:ts-node/register
--compilers tsx:ts-node/register
./src/**/*.spec.ts

【问题讨论】:

【参考方案1】:

ts-mock-imports 让您可以在运行时控制导入并保持类型安全。

app.spec.ts

import * as httpModule from 'http';
import  App  from '../src/app';
import  ImportMock  from 'ts-mock-imports';

const httpMock = ImportMock.mockClass(httpModule, 'Http');

const app = new App(); // App now uses a fake version of the Http class

现在您可以控制 Http 模块在测试中的行为方式。

模拟对 get 的响应:

httpMock.mock('get',  data: true );

const response = app.makeGetRequest(); // returns  data: true 

【讨论】:

【参考方案2】:

typescript 中的import 语句编译为require。您可以使用proxyquire 模拟测试中的任何依赖项

【讨论】:

我也无法使用 proxyquire。我最终将 webpack 与 inject-loader 一起使用。 @Raathigesh 你介意分享你的发现吗?我正在努力实现同样的目标.. @AndyPerlitch 我最终使用了 webpack 和 Inject-loader (github.com/plasticine/inject-loader) 我创建了 ts-mock-imports 以在 typescript 环境中像 proxyquire 一样工作。 回顾我的回答,我今天会做不同的事情。从长远来看,使用 Inversify 之类的东西将模拟依赖项注入测试会更容易。

以上是关于使用 Mocha 和 Typescript 模拟依赖项的主要内容,如果未能解决你的问题,请参考以下文章

使用 Typescript 在 Mocha 测试中使用 Mockery 有技巧吗?

如何在没有冲突的情况下将 Mocha 和 Jest 与 TypeScript 一起使用?

mocha+Typescript的单元测试搭建

chrome 未定义 - Mocha 和 Typescript

Mocha + TypeScript:不能在模块外使用导入语句

如何运行用 TypeScript 编写的 Mocha 测试?