jest.spyOn 方法返回一个 Promise

Man*_*lon 6 node.js es6-promise jestjs

我正在尝试测试一个应用程序,但jest.spyOn让我发疯。

我正在研究节点 v8.9.4 和 jest v22.2.2

我已经提取了这段代码:

// my-module.js
class MySingletonModule {
  constructor() {
    this.foo = 'bar';
  }
  myPromise() {
    return new Promise((resolve, reject) => resolve(this.foo));
  }
}

module.exports = new MySingletonModule();
Run Code Online (Sandbox Code Playgroud)
// promise.test.js
const singleton = require('./my-module');
describe('Module test-suite', () => {
  let spy;

  beforeAll(async () => {
    spy = jest.fn();
    spy = jest.spyOn(singleton, 'myPromise');
  });

  beforeEach(() => spy.mockReset());

  test('Check bar', () => {
    return singleton.myPromise().then((bar) => {
      expect(bar).toEqual('bar');
    });
  });

  test('Check called times', () => {
    singleton.myPromise();
    expect(spy).toHaveBeenCalledTimes(1);
  });

  afterAll(() => {
    jest.restoreAllMocks();
  });
});
Run Code Online (Sandbox Code Playgroud)

Check bar测试失败,因为该myPromise方法不返回一个承诺:

错误

如果我评论spy = jest.spyOn(singleton, 'myPromise');测试有效..但显然另一个测试不起作用..

在此处输入图片说明

我希望所有测试都可以使用spyOn,因为阅读文档是这样写的:

注意:默认情况下, jest.spyOn 也会调用 spied 方法。

我错过了什么?

谢谢您的帮助

And*_*nko 4

这是没有茉莉花的工作片段:

describe('Module test-suite', () => {
  let spy;

  beforeAll(() => { // get rid of async
    spy = jest.fn();
    spy = jest.spyOn(singleton, 'myPromise');
  });

  afterEach(() => spy.mockRestore()); // main difference is here

  test('Check bar', () => {
    return singleton.myPromise().then((bar) => {
      expect(bar).toEqual('bar');
    });
  });

  test('Check called times', () => {
    singleton.myPromise();
    expect(spy).toHaveBeenCalledTimes(1);
  });

  afterAll(() => {
    jest.restoreAllMocks();
  });
});
Run Code Online (Sandbox Code Playgroud)

我认为最好使用mockRestore而不是mockReset,因为据我从jest 文档 mockReset中了解到,几乎无法清除有关间谍和间谍对象的所有信息。并且mockRestore只是清除一些临时数据,例如调用次数。

为什么使用afterEach而不是beforeEach重要 - 我不知道:(

我还删除了async它,因为测试失败了。