Обещание Jest assert разрешено с помощью объекта, содержащего

#promise #jestjs #assert

#обещание #jestjs #утверждать

Вопрос:

Допустим, я хочу протестировать модуль, который возвращает 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)
  

Как это работает с обещаниями?

Ответ №1:

Есть два способа либо вернуть обещание из теста и выполнить утверждение в 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]);)
  })
})
  

Документы по этой теме

Ответ №2:

Самый простой подход — использовать .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 , если вы используете Jest >= 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!
  })
})
  

Комментарии:

1. Спасибо за это. Изначально я шел по этому пути, но он работает только при проверке всего объекта, а не чего-либо внутри объекта.

2. @sennett ах, предыдущие ответы (включая тот, который вы приняли) сравнивали весь объект, поэтому я предположил, что это то, что вы хотели. Я обновил свой первоначальный ответ, чтобы использовать его toMatchObject для только сравнения anArray свойства объекта, а также добавил тест, который только утверждает length о anArray свойстве, как было специально запрошено в вопросе.

Ответ №3:

Способ сделать это — передать 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();
    });
  })
})
  

Вы также можете просто вернуть обещание без необходимости done :

 describe('myFunc', () => {
  it('returns array of length 6', () => {
    expect.assertions(1)
    return myFunc().then((values) => {
      expect(values).toEqual([1,2,3...]);
    });
  })
})
  

Вы можете прочитать больше об этом здесь.