不能用玩笑的模拟函数覆盖函数
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 内部管理模块的方式有关,但我不确定。
我正在为调用 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 内部管理模块的方式有关,但我不确定。