Je commence à tester mon code avec Jest, et je ne peux pas faire un test apparemment simple à passer. J'essaie simplement de vérifier si ce que je reçois d'une demande de base de données Maogoose est un objet.

La fonction fetchPosts() fonctionne car je l'ai connectée à un frontend React et elle affiche correctement les données.

Voici ma fonction fetchPosts():

module.exports = {
    fetchPosts() {
        return new Promise((resolve, reject) => {
            Posts.find({}).then(posts => {
                if (posts) {
                    resolve(posts)
                } else {
                    reject()
                }
            })
        })
    }
}

Et mon test:

it('should get a list of posts', function() {
    return posts.fetchPosts().then(result => {
        expect(typeof result).toBe('object')
    })
})

Cela fait échouer le test, et Jest dit

" Délai d'expiration - Le rappel asynchrone n'a pas été invoqué dans le délai d'expiration de 5 000 ms spécifié par jest.setTimeout. "

QUESTION: Comment puis-je réussir ce test?

5
mokiliii Lo 20 nov. 2018 à 19:46

3 réponses

Meilleure réponse

Vous pouvez vous attendre à des résultats asynchrones en utilisant resolves, comme indiqué dans la documentation Jest.

Dans ton cas:

it('should get a list of posts', function() {
    const result = posts.fetchPosts();
    expect(result).resolves.toEqual(expect.any(Object));
})

… Bien que je soupçonne que votre liste de messages est en fait un tableau, vous voulez probablement ceci:

it('should get a list of posts', function() {
    const result = posts.fetchPosts();
    expect(result).resolves.toEqual(expect.any(Array));
})

Un autre conseil: vous n'avez pas besoin d'envelopper le corps de votre fetchPost dans une promesse supplémentaire, vous pouvez simplement retourner la promesse que vous obtenez de Posts.find et y ajouter un then, comme ce:

module.exports = {
    fetchPosts() {
        return Posts.find({}).then(posts => {
            if (posts) {
                return posts;
            } 
            throw new Error('no posts'); // this will cause a promise rejection
        })
    }
}
5
Patrick Hund 20 nov. 2018 à 17:12

De plus, si vous cherchez simplement à augmenter le délai, vous pouvez le faire en définissant

 jest.setTimeout(10000);

Vous pouvez utiliser cette instruction dans beforeEach si vous souhaitez modifier le délai d'expiration de tous vos tests dans ce bloc de description ou dans le bloc test / it / spec si vous le souhaitez pour un seul test.

1
shmit 20 nov. 2018 à 19:16

Il est également fort possible que vous n'obteniez aucune réponse de la base de données de votre suite de tests. Les suites de tests peuvent appeler différentes variables / configurations d'environnement qui conduisent à différents appels. Cette erreur peut également être observée si aucune réponse n'est renvoyée, comme dans - si quelqu'un empêche votre IP de se connecter, de continuer.

0
typo 30 mai 2019 à 17:03