【发布时间】:2021-12-09 11:17:01
【问题描述】:
我正在为我的一个端点编写一个测试,该端点调用超级账本结构上的链码事务。对于测试,我想重写 invoke 服务来模拟一个事务,这样新事务就不会每次都在结构中实际注册。
代码看起来很简单,但由于某种原因contractsSrv.invoke = jest.fn() 不起作用。每次都会执行原来的invoke。
我看到许多其他文章都说要使用 jest.mock('./myModule', () => ({ ...jest.requireActual('./myModule'), otherFn: () => {}})) 或 jest.spyOn 之类的东西。但这也行不通。充其量我能够让模拟函数返回“未定义”。
但除非我遗漏了什么,否则不应该简单的覆盖(如下所示)工作吗?当函数引用被替换为模拟函数的引用时,所有模块都应该缓存在内存中。
我使用的是旧版本的节点: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);
});
});
});
【问题讨论】:
标签: unit-testing jestjs commonjs