说我要测试一个返回Promise
的模块:
function myFunc () {
return Promise.resolve({
anArray: [1,2,3,4,5,6]
})
}
使用Jest,我如何断言诺言所解析的对象中包含的数组的长度?
describe('myFunc', () => {
it('returns array of length 6', () => {
expect.assertions(1)
return expect(myFunc()).resolves // ... something here
})
})
如果它是同步的,我会做类似的事情:
let result = myFunc()
expect(result.anArray.length).toBe(6)
这与Promises一起工作如何?
答案 0 :(得分:2)
有两种方法可以从测试中返回承诺并在then
中进行断言,或者使用async/await
进行测试
describe('myFunc', () => {
it('returns array of length 6', () => {
expect.assertions(1)
return expect(myFunc())
.then(result => expect(result).toEqual([1,2,3,4,5,6]);)
})
})
describe('myFunc',() => {
it('returns array of length 6', async() => {
const result = await expect(myFunc())
expect(result).toEqual([1,2,3,4,5,6]);)
})
})
关于此主题的docs
答案 1 :(得分:1)
执行此操作的一种方法是传递done
回调,将测试标记为异步,并强制jest
等待直到调用done()
:
describe('myFunc', () => {
it('returns array of length 6', (done) => {
expect.assertions(1)
myFunc().then((values) => {
expect(values).toEqual([1,2,3...]);
done();
});
})
})
您也可以返回Promise,而无需使用done
:
describe('myFunc', () => {
it('returns array of length 6', () => {
expect.assertions(1)
return myFunc().then((values) => {
expect(values).toEqual([1,2,3...]);
});
})
})
您可以阅读more about this here。
答案 2 :(得分:1)
最简单的方法是像在样本中一样开始使用.resolves
。
您只需要将.toMatchObject
链接到结果:
function myFunc () {
return Promise.resolve({
anArray: [1,2,3,4,5,6]
})
}
describe('myFunc', () => {
it('returns array of length 6', () => {
expect(myFunc()).resolves.toMatchObject({ anArray: [1,2,3,4,5,6] }); // Success!
})
})
这将断言该对象至少具有 的anArray
属性设置为[1,2,3,4,5,6]
(也可以具有其他属性)。
请注意,PR 5364使resolves
能够同步验证其参数,因此您甚至不必return
,await
或如果您使用的是done
> = v22.2.0
,请使用Jest
。
更新
听起来像目标是仅在数组的长度上断言。
为此,您需要获取Promise
的结果(如先前答案中所述),然后使用.toHaveLength
来声明anArray
属性的长度:
describe('myFunc', () => {
it('returns array of length 6', async () => {
const result = await myFunc();
expect(result.anArray).toHaveLength(6); // Success!
})
})