用玩笑模拟/存根Typescript接口

时间:2019-02-04 04:44:25

标签: typescript unit-testing jestjs

是否可以通过Jest或其他模拟/存根库对Typescript接口进行模拟或存根?

例如,我想模拟ExpressJS的Response对象: export interface Response extends http.ServerResponse, Express.Response

与其手工制作实现我要寻找的库来为我完成所有方法的对象。

2 个答案:

答案 0 :(得分:1)

我最终对其使用了类型断言,这有点hack。像这样:

const res = {} as Express.Response;

有关type assertions is available here的某些信息表示:

  

类型断言是一种告诉编译器“相信我,我知道我在做什么”的方法。类型断言就像其他语言中的类型转换一样,但是不执行任何特殊的数据检查或重组。它对运行时间没有影响,仅由编译器使用。 TypeScript假定您(程序员)已经执行了所需的任何特殊检查。

答案 1 :(得分:1)

从@ n00b获得灵感,但更完整地是:

首先对未知类型使用类型声明,然后对所需的接口使用类型声明,以使编译器接受它。

然后模拟您需要的东西(在此示例中,myFunction only 调用Response.send,您将需要模拟或多或少)

一个完整的示例,可以在__tests__/myFunctionTest.ts文件中:

import * as functions from 'firebase-functions';
import * as myfunction from '../src/myFunction';
test('it should do the thing', () => {
  const req = { } as unknown;
  const mockReq = req as functions.https.Request;
  const res = { send: jest.fn() } as unknown;
  const mockRes = res as functions.Response;
  myFunction.doTheThing(mockReq, mockRes);
  expect(mockRes.send).toBeCalledWith("{ 'status': 'the thing is done' }";
});

src/myFunction.ts文件为:

import * as functions from 'firebase-functions';

export const doTheThing = functions.https.onRequest((request, response) => {
  response.send("{ 'status': 'the thing is done' }");
});

请注意,这与Express所需的模拟非常接近-firebase函数的请求/响应基于这些Typescript接口构建,因此该策略应适用。