0

我试图集成 Jest 和 Supertest 以在一些中间件上构建集成测试。

我动态生成了我的中间件函数,因为它们改变了路由,看起来像这样:

export function middleware1(param: paramType) {
  return async (req: Request, res: Response, next: NextFunction) => {
    ...
  };
}

在我的 Jest 测试中,在文件的顶部,我模拟了 middleware1:

jest.mock('../middleware_path', () => ({
    middleware1: jest.fn(
      _ => {
        return (req, res, next) => {
          return new Promise((resolve, reject) => {
            console.log('Hello World');
            resolve(next());
          });
        };
    }),
}));

import * as middlewareUtils from 'middleware'
// This next line is necessary for TypeScript compilation
const mockedMiddlewareUtils = mocked(middlewareUtils);

当我通过使用 supertest 调用这个函数来访问我的 API 时,它肯定使用了这个模拟实现。它打印你好世界和一切!但是,当我expect(mockedMiddlewareUtils.middleware1).toHaveBeenCalled();在我的 it 声明中,它失败了。当我middlewareUtils.middleware1独立于 API 调用运行时,期望正确解析。为什么模拟不能正确解释函数调用?

4

1 回答 1

0

事实证明,这是因为 Express 在创建应用程序时执行中间件生成函数,它是在整个应用程序中不断调用的生成函数。生成函数被调用一次,其结果被调用多次。

您必须模拟中间件生成函数产生的函数(即 的结果middleware1),而不是生成函数本身。

于 2020-03-26T22:28:13.667 回答