我有一套测试,但是关于回调断言的问题只是没有点击。我的感觉是,需要编织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();
});
});
答案 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) => ...
多余的嵌套承诺是不必要的,这会使代码难以阅读。