gpt4 book ai didi

javascript - 用 Jest 模拟 ES6 类函数

转载 作者:可可西里 更新时间:2023-11-01 02:40:04 25 4
gpt4 key购买 nike

我有一个问题,关于如何使用 Jest 模拟 ES6 类实例,我实际想要测试的方法使用了它。我的真实案例是尝试测试一个 Redux 异步 Action 创建者,它发出请求并根据请求结果分派(dispatch)一些 Action 。

这是用例的简化示例:

// communication.js
// An exported ES6 class module with proxy to the request library.
import post from './post';
export default class communication {

getData(data, success, error) {
const res = post(data);
if(res) {
success();
} else {
error();
}
}
}

// communicatorAssist.js
// A redux async function using communication.js
import communication from './communication';
// ...

export function retrieveData() {
return dispatch => {
const data = { name: 'michel'};
communication.getData(data,
(res) => dispatch(successAction(res)),
(res) => dispatch(errorAction(res));
}
}

// communicatorAssist.test.js testing the communicatorAssist
import { retrieveData } from 'communicatorAssist';

// communication.getData should call success callback
// for this test.
it('Should call the success callback', () => {
retrieveData();
// Assert that mocked redux store contains actions
});

// communication.getData should call error callback
// for this test.
it('Should call the error callback', () => {
retrieveData();
// Assert that mocked redux store contains actions
});

我想要的是在测试中模拟通信类,并在每个测试中更改 getData() 函数的行为以调用 successerror 不调用任何 post 方法的回调。

我只成功地模拟了整个测试文件的 getData() 函数,并在它的顶部添加了这个片段:

import communication from '../communication'
jest.mock('../communication', () => (() => ({
getData: (success, error) => success()
})));

但我无法在不同测试用例的实现之间切换。

我认为使用 .mockImplementation() 的东西可以完成这些工作,但我无法在我的情况下完成这项工作(我看到了将它用于模块导出函数但不是用于类的示例)。

有没有人有想法?

编辑:

我忘记了代码示例中的一部分:通信类实例创建,我认为这是模拟它的“问题”:

const com = new communication();

如果 com 在 communicatorAssist.js 文件中在全局级别实例化:它会失败并出现 communication.getData is not a function 错误。

但是如果我在 retrieveData() 函数中设置实例化,Andreas Köberle 片段工作正常:

import communication from '../communication'
jest.mock('../communication', () => jest.fn());

communication.mockImplementation(
() => ({
getData: (success, error) => success()
})
)

(jest.mock() 工厂参数需要返回函数不直接jest.fn)

我不知道为什么它不能使用文件全局范围实例。

最佳答案

您需要使用jest.fn() 模拟模块,然后您可以导入它并使用mockImplementation 更改它的行为。 :

import communication from '../communication'
jest.mock('../communication', jest.fn());

communication.mockImplementation(
() => ({
getData: (success, error) => success()
})
)

关于javascript - 用 Jest 模拟 ES6 类函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46500749/

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