开玩笑如何模拟 api 调用

Posted

技术标签:

【中文标题】开玩笑如何模拟 api 调用【英文标题】:Jest how to mock api call 【发布时间】:2018-05-05 02:08:09 【问题描述】:

我试图用玩笑来模拟我的 api 调用,但由于某种原因它不起作用。我真的不明白为什么。有人有想法吗?

(test keep调用原始api调用函数而不是mock)

我的 test.js

import  getStuff  from '../stuff';
import * as api from '../../util/api';

describe('Action getStuff', () => 
        it('Should call the API to get stuff.', () => 
            api.call = jest.fn();
            getStuff('slug')(() => , () => );
            expect(api.call).toBeCalled();
            jest.unmock('../../util/api.js');
        );
);

stuff.js 还原动作

import api from '@util/api';
import  STUFF, API  from '../constant';


export const getStuff = slug => (dispatch, getState) => 
    const state = getState();
    api.call(API.STUFF.GET, (err, body) => 
        if (err) 
            console.error(err.message);
         else 
            dispatch(
                type: STUFF.GET,
                results: body,
            );
        
    , 
        params:  slug ,
        state
    );
;

【问题讨论】:

【参考方案1】:

导入是不可变的,所以它不起作用,你应该模拟整个模块。使用__mock__ 目录或简单地使用:

jest.mock('../../util/api');
const  call  = require('../../util/api');
call.mockImplementation( () => console.log("some api call"));

【讨论】:

知道如何测试吗? (err, body) => if (err) console.error(err.message); else dispatch( type: STUFF.GET, results: body, ); 这种方法有什么问题?如果它是调度,你只需要模拟提供给方法的任何东西 谢谢,我想我找到了我想要的 api.call = jest.fn((route = '', callback) => callback( message: 'some error' , null) ; );

以上是关于开玩笑如何模拟 api 调用的主要内容,如果未能解决你的问题,请参考以下文章

如何开玩笑地模拟 VueAxios

开玩笑:当第三方库使用控制台时如何模拟控制台?

如何用玩笑模拟组件中使用的“嵌套”角度服务

开玩笑的预期模拟未调用(redux 组件)

开玩笑的测试在调用模拟的 firebase 函数之前完成,因此失败

在开玩笑的模拟模块工厂中模拟一个承诺