不能用玩笑的模拟函数覆盖函数

cannot override function with jest mock function

我正在为调用 hyperledger fabric 上的链代码事务的端点之一编写测试。为了测试,我想重写 invoke 服务来模拟一个事务,这样新的事务就不会每次都在 fabric 中实际注册。

代码看起来很简单,但由于某些原因 contractsSrv.invoke = jest.fn() 不起作用。原来每次都执行invoke

我看过许多其他文章,说明要使用 jest.mock('./myModule', () => ({ ...jest.requireActual('./myModule'), otherFn: () => {}}))jest.spyOn 之类的东西。但它也行不通。充其量我能够将模拟函数设置为 return "undefined".

但是除非我遗漏了什么,否则简单的覆盖(如下所示)不应该起作用吗?当函数引用被替换为模拟函数的引用时,所有模块都应该缓存在内存中。

我使用的是旧版本的节点:14.13.1,因为结构需要它。因此,还使用旧版本的 Jest:26.6.3.

'use strict';

require('dotenv').config();
const request = require('supertest');

const contractsSrv = require('../../../services/contracts.srv');
const config = require('config');

let server;
jest.setTimeout(3000);

describe('/api/contracts', () => {
  beforeEach(() => {
    server = require('../../../server');
  });
  afterEach(() => {
    server.close();
  });

  describe('post /', () => {
    it('return transaction record and id', async () => {
      contractsSrv.invoke = jest.fn().mockResolvedValue({
        data: {
          response: 'true',
          txID: config.get('TX_ID'),
        },
      });
   
      const res = await request(server)
        .post('/api/contracts')
        .send({
          field1: '001',
          field2: '002',
        })
        .set('api-token', config.get('TOKEN'));

      expect(res.status).toBe(200);
    });
  });
 
});

我能够通过使用不同的方法使其工作。我已经删除了函数覆盖并在 describe 方法之外做了一个 jest.doMock。

jest.doMock('../../../services/contracts.srv', () => {
  return {
    invoke: jest.fn().mockResolvedValue({
      data: {
        response: 'true',
        txID: config.get('TX_ID'),
      },
    }),
  };
});

我仍然不知道为什么简单的覆盖不起作用。我认为它确实适用于旧版本的 jest,所以我认为这与 jest 内部管理模块的方式有关,但我不确定。