gpt4 book ai didi

javascript - 如何用 Jest 覆盖(或模拟)类方法以测试函数?

转载 作者:行者123 更新时间:2023-11-29 16:02:29 25 4
gpt4 key购买 nike

我对调用类的函数进行单元测试时遇到问题。似乎它总是调用“官方”类实例而不是我的模拟类。我无法强制我的函数使用我的模拟实例...

有一个文件包含我要测试的功能:

const myClass = require('./myClass');
const instance = new myClass();

module.exports.functionToTest = async function () {

// Some stuff...

const value = await instance.myMethod();

// Some stuff that define a result variable (partially with value).

return result;
}

有一个包含我的类定义的文件:

module.exports = class myClass {
async myMethod() {
const result = await someStuffWillResolveMaybeTrueOrFalse();

console.log('We used the original myMethod... Mocking has failed.');

return result;
}
}

有一个spec文件:

const myFile = require('./myFile');
const myClass = require('./myClass');

describe('My test', async () => {
it('should mock myClass.myMethod in order to return false', () => {
const instance = new myClass();
instance.myMethod = jest.fn().mockResolvedValue(false);

const result = await myFile.functionToTest();

expect(result).toBeTruthy();
}
}

不幸的是,我的测试通过了(因为 myMethod 返回“true”)并记录“我们使用了原始的 myMethod...模拟失败。”

所以我想通过模拟 myMethod 返回 false 让我的测试总是失败。

你能帮帮我吗?感谢您的宝贵时间。

最佳答案

嗯。我找到了解决方案。

看。使用目标函数更改我的文件。

const myClass = require('./myClass');
// const instance = new myClass(); <== Not here...

module.exports.functionToTest = async function () {
const instance = new myClass(); // <== ...but there.

// Some stuff...

const value = await instance.myMethod();

// Some stuff that define a result variable (partially with value).

return result;
}

还有我的规范文件:

const myFile = require('./myFile');

// I specify to Jest that I'll mock a file
jest.mock('./myClass');
const myClass = require('./myClass');

// I prepare the mock function. In that case a promise wich resolve 'false'
const mMock = jest.fn().mockResolvedValue(false);

// I mock the method 'myMethod' in 'myClass'
myClass.mockImplementation(() => {
return {
myMethod: mMock
};
});


// Then, I just take the test
describe('My test', async () => {
it('should mock myClass.myMethod in order to return false', () => {
const result = await myFile.functionToTest();

expect(result).toBeFalsy();
}
}

关于javascript - 如何用 Jest 覆盖(或模拟)类方法以测试函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50716424/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com