【问题标题】:Testing the result of a promise with Jest inside a function在函数中使用 Jest 测试 promise 的结果
【发布时间】:2020-09-03 09:31:34
【问题描述】:

documentation 的笑话涵盖了给定函数返回 Promise 的情况并演示了如何测试它。
但是如何在函数内部测试调用 Promise 的 .then 的 void 函数?

这是一个示例,说明我是如何考虑这样做的,但这不起作用。

函数

function dummyFunction(): void {
   dummyService.getDummy$().then((dummy: Dummy): void => {
      console.log(`Dummy fetched`);
   });
}

测试

describe(`dummyFunction()`, (): void => {
   let dummyServiceGetDummy$Spy: jest.SpyInstance;
   let consoleLogSpy: jest.SpyInstance;

   beforeEach((): void => {
      dummyServiceGetDummy$Spy = jest.spyOn(dummyService, `getDummy$`).mockImplementation();
      consoleLogSpy = jest.spyOn(console, `log`).mockImplementation();
   });

   it(`should fetch dummy`, (): void => {
      expect.assertions(2);

      dummyFunction();

      expect(dummyServiceGetDummy$Spy).toHaveBeenCalledTimes(1);
      expect(dummyServiceGetDummy$Spy).toHaveBeenCalledWith();
   });

   describe(`when dummy was successfully fetched`, (): void => {
      beforeEach((): void => {
         dummyServiceGetDummy$Spy.mockReturnValue((): Promise<void> => Promise.resolve());
      });

      it(`should log`, (): void => {
         expect.assertions(2);

         dummyFunction();

         expect(consoleLogSpy).toHaveBeenCalledTimes(1);
         expect(consoleLogSpy).toHaveBeenCalledWith(`Dummy fetched`);
      });
   });
});

依赖关系

"jest": "26.0.1"
"ts-jest": "26.0.0"

【问题讨论】:

    标签: javascript typescript testing promise jestjs


    【解决方案1】:

    Promise 封装是一种反模式。 dummyFunction 应该向链返回一个承诺,以便正确地重用和测试:

    function dummyFunction(): void {
       return dummyService.getDummy$().then((dummy: Dummy): void => {
          console.log(`Dummy fetched`);
       });
    }
    

    然后可以使用内置的 Jest Promise 支持进行测试:

       it(`should fetch dummy`, async () => {
          await expect(dummyFunction()).resolves.toBe(undefined);
    
          expect(dummyServiceGetDummy$Spy).toHaveBeenCalledWith();
          expect(consoleLogSpy).toHaveBeenCalledWith(`Dummy fetched`);
       });
    

    【讨论】:

    • 谢谢,我会尝试更改我的代码。不过,弯曲代码来处理覆盖范围似乎有点奇怪。
    • 这肯定是按照文档工作的,因为该方法返回一个 Promise。记住尽可能更改所有函数以返回 Promise。谢谢。
    猜你喜欢
    • 2020-10-19
    • 2020-04-21
    • 1970-01-01
    • 2018-03-24
    • 2018-10-06
    • 2021-06-23
    • 1970-01-01
    • 2018-07-06
    • 2018-07-08
    相关资源
    最近更新 更多