Javascript 笑话:如何计算通过'call'或'apply'调用的模拟方法的调用?

Javascript 笑话:如何计算通过'call'或'apply'调用的模拟方法的调用?,javascript,unit-testing,mocking,jestjs,Javascript,Unit Testing,Mocking,Jestjs,如何使用mock计算通过call或apply进行的函数调用 如果显式调用myLib.requestInfo,则第二个期望成功 是否有方法监视通过apply或call调用其函数的模块模拟调用?来自jest.mock: 在需要时使用自动模拟版本模拟模块 通过更好地描述自动模拟版本的含义,文档可能会得到改进,但实际情况是Jest保持模块的API表面不变,同时将实现替换为空 因此,在本例中,execute被调用,但它已被一个空的模拟函数替换,因此永远不会调用requestInfo,从而导致测试失败 为了

如何使用mock计算通过call或apply进行的函数调用

如果显式调用myLib.requestInfo,则第二个期望成功

是否有方法监视通过apply或call调用其函数的模块模拟调用?

来自jest.mock:

在需要时使用自动模拟版本模拟模块

通过更好地描述自动模拟版本的含义,文档可能会得到改进,但实际情况是Jest保持模块的API表面不变,同时将实现替换为空

因此,在本例中,execute被调用,但它已被一个空的模拟函数替换,因此永远不会调用requestInfo,从而导致测试失败

为了保持execute的实现完好无损,您需要避免对整个模块进行自动模拟,而是通过以下方式监视原始函数:

来自jest.mock:

在需要时使用自动模拟版本模拟模块

通过更好地描述自动模拟版本的含义,文档可能会得到改进,但实际情况是Jest保持模块的API表面不变,同时将实现替换为空

因此,在本例中,execute被调用,但它已被一个空的模拟函数替换,因此永远不会调用requestInfo,从而导致测试失败

为了保持execute的实现完好无损,您需要避免对整个模块进行自动模拟,而是通过以下方式监视原始函数:


在您的示例中,myLib没有ArrangeView方法。请你更新一下这个例子,否则很难得到你想要的。对不起,我从这个例子中删除了错误的方法。已更新。在您的示例中,myLib没有ArrangeView方法。请你更新一下这个例子,否则很难得到你想要的。对不起,我从这个例子中删除了错误的方法。更新。
// mylib.js
module.exports = {
  requestInfo: function(model, id) {
    return `The information for ${model} with ID ${id} is foobar`;
  },
  execute: function(name) {
    return this[name] && this[name].apply(this, [].slice.call(arguments, 1));
  },
};
// mylib.test.js
jest.mock('./mylib.js');

var myLib = require('./mylib.js');

test('', () => {
  myLib.execute('requestInfo', 'Ferrari', '14523');
  expect(myLib.execute.mock.calls.length).toBe(1); // Success!
  expect(myLib.requestInfo.mock.calls.length).toBe(1); // FAIL
});
var myLib = require('./mylib.js');

test('', () => {
  jest.spyOn(myLib, 'execute');  // spy on execute
  jest.spyOn(myLib, 'requestInfo')  // spy on requestInfo...
    .mockImplementation(() => {});  // ...and optionally replace the implementation
  myLib.execute('requestInfo', 'Ferrari', '14523');
  expect(myLib.execute.mock.calls.length).toBe(1); // SUCCESS
  expect(myLib.requestInfo.mock.calls.length).toBe(1); // SUCCESS
});