407 votes

Pouvez-vous écrire des tests asynchrones qui attendent toThrow ?

J'écris un test asynchrone qui s'attend à ce que la fonction asynchrone soit lancée comme ceci :

it("expects to have failed", async () => {
  let getBadResults = async () => {
    await failingAsyncTest()
  }
  expect(await getBadResults()).toThrow()
})

Mais Jest échoue juste au lieu de passer le test :

 FAIL  src/failing-test.spec.js
   expects to have failed

    Failed: I should fail!

Si je réécris le test pour qu'il ressemble à ceci :

expect(async () => {
  await failingAsyncTest()
}).toThrow()

J'obtiens cette erreur au lieu d'un test réussi :

expect(function).toThrow(undefined)

Expected the function to throw an error.
But it didn't throw anything.

5voto

Juan Giacosa Points 63

J'ai testé les fonctions cloud de Firebase et voici ce que j'ai trouvé :

test("It should test async on failing cloud functions calls", async () => {
    await expect(async ()=> {
        await failingCloudFunction(params)
    })
    .rejects
    .toThrow("Invalid type"); // This is the value for my specific error
  });

Il est construit sur la base de la réponse de lisandro .

2voto

Günter Zöchbauer Points 21340

Cela a fonctionné pour moi

it("expects to have failed", async () => {
  let getBadResults = async () => {
    await failingAsyncTest()
  }
  expect(getBadResults()).reject.toMatch('foo')
  // or in my case
  expect(getBadResults()).reject.toMatchObject({ message: 'foo' })
})

-3voto

Peter Akinlolu Points 19
test("It should test async on failing cloud functions calls", async () => {
   failingCloudFunction(params).catch(e => {
    expect(e.message).toBe('Invalid type')
   })
  });

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X