#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...]);
});
})
})
Вы можете прочитать больше об этом здесь.