开玩笑测试:带有延迟的mockResolveValue

问题描述 投票:0回答:1

如何在玩笑测试中延迟模拟ReturnValue?

此测试的目的是模拟方法在flushpromise上未解决。比方说,

  • 如果我们有在测试类上被嘲笑的承诺。一旦flushpromise,它将解决承诺,我们可以断言该语句已解决或已拒绝。
  • 对测试类的要求是在flushpromise之后promise不应该被解决或拒绝(测试未解决)。

有两种可能的方法,我们可以通过

实现这一点
  1. 使mockReturnValue返回空的promise。
  2. 使用jeskfaketimer延迟mockReturnvalue

上述两个选项预计都会在断言时给出未解决的承诺。

尽管如此,第二个选项似乎不适用于以下代码。任何意见都将受到赞赏。

尝试了以下代码。

`

import callout from ".../callout.."

jest.mock(
"../callout..",
()=>{
    return{
         default:jest.fn(),
         };
    },
    {virtual: true}
);

const { setImmediate } = require("timers");

function flushPromises()
{
return new Promise((resolve)=> setImmediate(resolve));
}


`it("test delay", async()=>{
       jest.useFakeTimers();
       callout.mockResolvedValue(()=> Promise(resolve=>setTimeout(()=>resolve(),2000)));
       jest.advanceTimersByTime(20);
       await flushpromises();
       expect(callout).not.toHavebeencalled();
       jest.advanceTimersByTime(2000);
       expect(callout).toHavebeencalled();


});

`

testing jestjs mocking delay
1个回答
1
投票

我可以通过以下更改解决问题。

基本上,我用

setTimeout
自定义函数替换了
wait
,如下所示。

import callout from ".../callout..";

jest.mock(
  "../callout..",
  () => {
    return {
      default: jest.fn(),
    };
  },
  { virtual: true }
);

const { setImmediate } = require("timers");

function flushPromises() {
  return new Promise((resolve) => setImmediate(resolve));
}

function wait(ms, value) {
  return new Promise((resolve) => setTimeout(resolve, ms, value));
}

it("test delay", async () => {
  jest.useFakeTimers();
  let response = JSON.stringify({ status: 200, data: true });
  callout.mockReturnValueOnce(wait(2000, response));
  jest.advanceTimersByTime(20);
  await flushpromises();
  expect(callout).not.toHavebeencalled();
  jest.advanceTimersByTime(2000);
  expect(callout).toHavebeencalled();
});

© www.soinside.com 2019 - 2024. All rights reserved.