我遇到了使用 Jest 模拟函数调用的问题。这是我需要嘲笑的行:
let res = await bot.getUser(userId);
bot 对象通过模块访问,并进行 API 调用以获取用户对象。
我尝试过的事情:
let userInfo = await getUser(userId, bot);
替换了该行并将上面的逻辑移到该文件中。这是该文件的样子:export const getUser = async (userId, bot) => {
let res = await bot.getUser(userId);
return res;
};
我关注了 Jest 码头并创建了一个 __mocks__
文件夹并添加了 getUser.js
/__mocks__/getUser.js
看起来像这样:
export const getUser = () => {
return Promise.resolve({
user: { firstName: 'John', lastName: 'Doe' },
});
};
我的测试(getUser
调用在 handleMessage4Bot
内):
import { handleMessage4Bot } from '../src/handlers/index';
jest.mock('../src/utils/getUser');
const event = { type: 'Message4Bot' };
it('Should return John Doe', async () => {
let response = await handleMessage4Bot(event);
expect(response).toBe({
user: { firstName: 'John', lastName: 'Doe' },
});
});
当我只测试 getUser
时,它仍然返回 undefined
:
import getUser from '../getUser';
jest.mock('../getUser');
it('Should return John Doe', async () => {
let response = await getUser();
console.log('response :>> ', response);
expect(response).toStrictEqual({
user: { firstName: 'John', lastName: 'Doe' },
});
});
答案 0 :(得分:0)
我能够使用您提供的代码为我工作。我认为您的目录结构或您定义事物的地方可能会搞砸。例如,我注意到您从 getUser
导入 ../src/utils/index;
但您的模拟在 ../src/utils/getUser
我的工作示例:
src/utils/getUser.js
module.exports = async () => {
return Promise.resolve({
user: { firstName: 'Jane', lastName: 'Doe' },
});
};
scr/utils/__tests__/getUserTest.js
const getUser = require('../getUser');
jest.mock('../getUser');
it('Should return John Doe', async () => {
let response = await getUser();
console.log('response :>> ', response);
expect(response).toStrictEqual({
user: { firstName: 'John', lastName: 'Doe' },
});
});
src/utils/__mocks__/getUser.js
module.exports = async () => {
return Promise.resolve({
user: { firstName: 'John', lastName: 'Doe' },
});
};
答案 1 :(得分:0)
看起来我的问题是我的 Jest 和 Babel 配置。我通过运行解决了问题:
yarn add --dev babel-jest @babel/core @babel/preset-env
然后
npx jest --init
或(如果 jest 是全局安装的)jest --init
然后按照说明选择babel
。