Jest声明使用包含对象解析的promise

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

假设我想测试一个返回Promise的模块:

function myFunc () {
    return Promise.resolve({
        anArray: [1,2,3,4,5,6]
    })
}

使用Jest,如何断言promise解析为的对象中包含的数组的长度?

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有什么关系?

promise jestjs assert
3个回答
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
投票

一种方法是传递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


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,您甚至不必使用doneJest或使用v22.2.0


更新

听起来目标只是断言数组的长度。

为此,您需要获得Promise的结果(如前面的答案中所述),然后使用.toHaveLength来断言anArray属性的长度:

describe('myFunc', () => {
  it('returns array of length 6', async () => {
    const result = await myFunc();
    expect(result.anArray).toHaveLength(6);  // Success!
  })
})
© www.soinside.com 2019 - 2024. All rights reserved.