模拟使用jest进行数据库调用的方法的问题

tvokkenx  于 2023-09-28  发布在  Jest
关注(0)|答案(2)|浏览(154)

我面临的问题模拟一个方法,内部调用数据库获取数据。请在下面找到代码:

const getData = async (...args) => {

    // first call
    await db.getData();
    
    // second call
    await db.queryData();
    
    return data;
}

const generateResult = async (...args) => {

    const data = await getData(...args);
    // rest of the code
    
    return result;
}

export ClassTest;

在测试文件中:

describe(('Verify generateResult') => {

    jest.spyOn(generateResult, 'getData').mockImplementation((...args) => {
        return data;
    });

    it('should return result', async () => {
        const result = await generateResult(..args);
        expect(result).toBeTruthy();
    });
});

getData方法进行数据库调用以检索数据。代码的其余部分只是处理数据并返回结果。即使它被模仿,代码在进行数据库调用时也会失败。我假设它应该从模拟的实现中获取数据,其余的代码应该执行。不知道这里出了什么问题。任何人都可以请让我知道。没有很多编写jest测试用例的经验。
谢谢

5fjcxozz

5fjcxozz1#

有没有可能将getData方法移到另一个模块?然后你可以模仿getData,导入的版本将是到处都被模仿的版本。只是个想法
getData.js

export const getData = async (...args) => {
    const data = await Promise.resolve(false);
    console.log('original called')
    return data;
}

dbUtils.js

import { getData } from './getData'

export const generateResult = async (...args) => {
    const data = await getData(...args);
    return data;
}

和测试:

import * as getDataUtils from '../getData';
import { generateResult } from '../dbUtils';

it('should return result', async () => {
    jest.spyOn(getDataUtils, 'getData').mockResolvedValue(true);

    const result = await generateResult();
    expect(result).toBeTruthy();
});
3phpmpom

3phpmpom2#

在这篇文章中回答了类似的问题:Jest mock inner function
如果您将helper函数getData移到一个单独的模块中并将该模块导入generateResult,这将有所帮助。见下文:
helper.js

const getData = async (...args) => {
    await db.getData();
    await db.queryData();
    
    return data;
}

index.js

import * as helper from './helper'

export const generateResult = async (...args) => {
    const data = await helper.getData(...args);
    return data;
}

和测试:

import * as helper from './helper'
import { generateResult } from '../dbUtils';

it('should return result', async () => {
    jest.spyOn(helper, 'getData').mockResolvedValue(true);
    // or 
    helper.getData = jest.fn().mockImplementation(() => true);

    const result = await generateResult();
    expect(result).toBeTruthy();
});

相关问题