gpt4 book ai didi

javascript - Jest spyOn() 调用实际函数而不是模拟函数

转载 作者:行者123 更新时间:2023-11-29 18:48:28 26 4
gpt4 key购买 nike

我正在测试调用其辅助函数 callApiapiMiddleware。为了防止调用将发出 API 调用的实际 callApi,我模拟了该函数。但是,它仍然会被调用。

apiMiddleware.js

import axios from 'axios';

export const CALL_API = 'Call API';

export const callApi = (...arg) => {
return axios(...arg)
.then( /*handle success*/ )
.catch( /*handle error*/ );
};

export default store => next => action => {
// determine whether to execute this middleware
const callAPI = action[CALL_API];
if (typeof callAPI === 'undefined') {
return next(action)
}

return callAPI(...callAPI)
.then( /*handle success*/ )
.catch( /*handle error*/ );
}

apiMiddleware.spec.js

import * as apiMiddleware from './apiMiddleware';

const { CALL_API, default: middleware, callApi } = apiMiddleware;

describe('Api Middleware', () => {

const store = {getState: jest.fn()};
const next = jest.fn();
let action;

beforeEach(() => {
// clear the result of the previous calls
next.mockClear();
// action that trigger apiMiddleware
action = {
[CALL_API]: {
// list of properties that change from test to test
}
};
});

it('calls mocked version of `callApi', () => {
const callApi = jest.spyOn(apiMiddleware, 'callApi').mockReturnValue(Promise.resolve());

// error point: middleware() calls the actual `callApi()`
middleware(store)(next)(action);

// assertion
});
});

请忽略 callApi 函数的操作属性和参数。我不认为它们是我要表达的重点。

如果您需要进一步说明,请告诉我。

最佳答案

Jest 模拟只适用于导入的函数。在您的 apiMiddleware.js 中,default 函数正在调用 callApi 变量,而不是“导出的”callApi 函数。要使模拟工作,请将 callApi 移动到它自己的模块中,然后将其导入 apiMiddleware.js

好问题!

关于javascript - Jest spyOn() 调用实际函数而不是模拟函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52306745/

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