Jest assert обещано разрешено с помощью объекта, содержащего - PullRequest
0 голосов
/ 14 марта 2019

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

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

Ответы [ 3 ]

2 голосов
/ 14 марта 2019

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

документы на этомтема

1 голос
/ 14 марта 2019

Самый простой подход - использовать .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 голос
/ 14 марта 2019

Способ сделать это - передать обратный вызов 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...]);
    });
  })
})

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

...