Je commence à tester mon code avec Jest, et je ne peux pas réussir un test apparemment simple. 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 parce que je l'ai connectée à une interface React et qu'elle affiche les données correctement.
Ceci est 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
' Timeout - Le rappel asynchrone n'a pas été appelé dans le délai d'expiration de 5000 ms spécifié par jest.setTimeout. '
QUESTION: Comment puis-je réussir ce test?
Vous pouvez vous attendre à des résultats asynchrones en utilisant resolves
, comme indiqué dans la documentation de 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 publications est en réalité 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));
})
Autre astuce: Vous n'avez pas besoin de mettre le corps de votre fetchPost
dans une promesse supplémentaire, vous pouvez simplement renvoyer la promesse que vous obtenez de Posts.find
et y ajouter une then
, comme ceci:
module.exports = {
fetchPosts() {
return Posts.find({}).then(posts => {
if (posts) {
return posts;
}
throw new Error('no posts'); // this will cause a promise rejection
})
}
}