断言使用Jest调用了回调(没有React)吗?

时间:2018-10-21 09:50:22

标签: javascript jestjs

我有一套测试,但是关于回调断言的问题只是没有点击。我的感觉是,需要编织done()参数,但是我做错了。

我基本上有两个函数结构,其中回调要么嵌套在单个then语句内,要么嵌套在then内:

function foo(cb) {
   return fetch('foo.com')
          .then(
              (res)=>{
               res
               .json()
               .then(
                 (data) =>cb(data)
              })
          .catch(err => console.error(err))
}

function foo(cb) {
     return fetch('foo.com')
            .then(()=>cb())
            .catch(err => console.error(err))
}

我希望断言在两种情况下都调用了回调。

我尝试过

describe('ugh why can't I figure this out'?, () => {
it('is confusing', (done) => {

const testCb = jest.fn()

foo(testCb);

expect(testCb).toHaveBeenCalled()

done();

//failed: expected testCb to be called, but it was not called
}
})

我不确定该如何前进-我不是穿意大利面条的粉丝,所以我宁愿在开始切换为其他语法之前,了解如何实现测试异步代码的目的。上面的代码似乎应该起作用,因为回调是函数执行的一部分,因此,如果执行更高阶的函数,则必须执行该回调,并且该回调应被“调用”。显然,这种推理是错误的,因为测试没有通过,但是我不太了解解决方法。

非常感谢任何指导/见解:)。

这个开玩笑的例子似乎与我的相符-我想念的是什么?

describe('drinkAll', () => {
  test('drinks something lemon-flavored', () => {
    let drink = jest.fn();
    drinkAll(drink, 'lemon');
    expect(drink).toHaveBeenCalled();
  });

  test('does not drink something octopus-flavored', () => {
    let drink = jest.fn();
    drinkAll(drink, 'octopus');
    expect(drink).not.toHaveBeenCalled();
  });
});

1 个答案:

答案 0 :(得分:0)

expect回来之前,您正在fetch被呼叫。这样做:

foo(testCb)
  .then(_ => {
    expect(testCb).toHaveBeenCalled();
    done();
  })
  .catch(err => {
    done.fail(err);
  });

通过链接到foo返回的Promise,我们确保fetch已经回来。异步后,就必须保持同步,就不能像在已发布的代码中那样混合使用同步代码和异步代码:

const testCb = jest.fn()

foo(testCb); // this can take an arbitrary amt of time

expect(testCb).toHaveBeenCalled() // but this happens immediately

done();

FWIW,您也可以更改此

return fetch('foo.com')
          .then(
              (res)=>{
               res
               .json()
               .then(
                 (data) =>cb(data)
              })

对此:

return fetch('foo.com')
          .then((res)=> res.json())
          .then(cb)
          .catch((err) => ...

多余的嵌套承诺是不必要的,这会使代码难以阅读。