开玩笑断言承诺与对象包含解决

时间:2019-03-14 09:07:30

标签: promise jestjs assert

说我要测试一个返回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一起工作如何?

3 个答案:

答案 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能够同步验证其参数,因此您甚至不必returnawait或如果您使用的是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!
  })
})