【问题标题】:Trigger mocked callback argument with Jest用 Jest 触发模拟回调参数
【发布时间】:2020-10-28 21:01:07
【问题描述】:

使用 Jest,我想触发 configure 回调参数。如果我用sinon 存根来写这个,我可以做类似configure.yields('my value') 的事情。 Jest有类似的吗?为了帮助说明我所追求的,我创建了一个简单的示例。

我已导入 mymodule,实例化并调用 configure 函数。我希望我的测试触发这个回调。即(err, results) => ...

import MyModule from 'mymodule';

export function execute(key, value) {
  return new Promise((resolve, reject) => {
      new MyModule().configure(key, value, (err, result) => {
          // I need my test to trigger this section of code...
          return resolve('my resolved value')
      })
  })
}

此测试模拟MyModule 并将configure 设置为jest.fn()。虽然我已经模拟了所有内容,但我无法指定 configure 参数并触发特定参数。理想情况下,我想做类似mockFn.yields('my value') 的操作来触发configure 回调。

import MyModule from 'mymodule';

jest.mock('mymodule');
describe('Test Example', () => {
  test('should trigger mocked args callback', async () => {
      const mockFn = jest.fn();
      const key = 'my_key';
      const value = 'my_value';

      const actual = require('./src/my-service');

      MyModule.mockImplementation(() => {
        return {
            configure: mockFn
        };
      });

      await actual.execute(key, value)

      // how can I trigger the mocked configure argument callback?
  });
});

测试当前失败,因为它无法触发回调函数。错误状态:Async callback was not invoked

【问题讨论】:

    标签: javascript jestjs


    【解决方案1】:

    该错误意味着 test async 函数返回的承诺尚未解决。发生这种情况是因为 execute 返回一个待处理的承诺,模拟 configure 没有调用应该解决它的回调。

    configure 应该被正确地模拟,并且在回调参数方面的行为与原始实现相同:

    mockFn.mockImplementation((key, value, cb) => cb(null, 'some result'));
    const promise = actual.execute(key, value);
    expect(mockFn).toBeCalledWith(key, value, expect.any(Function));
    await expect(promise).resolves.toBe('my resolved value');
    

    【讨论】:

    • 这很有帮助。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2019-12-10
    • 2021-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-07
    • 2021-12-15
    • 2023-03-04
    相关资源
    最近更新 更多