【问题标题】:Order of functions being executed in Express messed with tests在 Express 中执行的函数顺序与测试混淆
【发布时间】:2020-07-07 16:04:33
【问题描述】:

我试图集成 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 来调用这个函数时,它肯定会使用这个模拟实现。它打印你好世界和一切!但是,当我在我的 it 语句中 expect(mockedMiddlewareUtils.middleware1).toHaveBeenCalled(); 时,它失败了。当我独立于 API 调用运行 middlewareUtils.middleware1 时,期望正确解析。为什么 mock 不能正确解释函数调用?

【问题讨论】:

  • 那不是中间件,是中间件工厂

标签: javascript unit-testing jestjs supertest ts-jest


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多