Jest模拟函数调用不计算

时间:2017-10-04 13:46:37

标签: unit-testing mocking jest

Jest模拟功能

我想模拟一个对象的函数帖子。我这样说:

jest.mock('../../apis.js', () => {
  return () => {
    return {
      post: jest.fn(() => {
        console.log('POST was called !');
        return Promise.resolve();
      }),
    };
  };
});

然后,我提出要求:

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

最后,我致电我的服务,该服务将从post()模块调用apis函数:

client.doPost()
  .then(() => {
    console.log('count: ', apis().post.mock.calls.length);
    expect((apis().post)).toBeCalled();
  });

doPost()函数调用模拟的post()一个(打印出'POST被叫!'消息)但是count is equal to 0并且期望失败。

我做错了什么? 谢谢你的帮助!

2 个答案:

答案 0 :(得分:1)

这需要进行检查,但我想您在apis().post.mock.calls.length电话中访问的变量与您在client.doPost()电话中使用的变量不同。

实际上,当你调用apis()时,你的模拟会在每次调用时返回一个新对象。

您要做的是将存根存储在专用变量中,并在then()测试中访问它:

const postStub = jest.fn(() => {
  console.log('POST was called !');
  return Promise.resolve();
});

jest.mock('../../apis.js', () => {
  return () => {
    return {
      post: postStub,
    };
  };
});

然后使用它(当然应该在同一个文件中):

client.doPost()
  .then(() => {
    console.log('count: ', postStub.mock.calls.length);
    expect((apis().post)).toBeCalled();
  });

答案 1 :(得分:0)

解决方法

global.iPost=0;

jest.mock('../../apis.js', () => {
  return () => {
    return {
      post: jest.fn(() => {
        console.log('POST was called !');
        global.iPost++;
        return Promise.resolve();
      }),
    };
  };
});

expect(global.iPost).toEqual(1)