Je suis en train d'apprendre Node.js et j'ai joué avec Express . J'aime vraiment le framework; cependant, j'ai du mal à comprendre comment écrire un test unitaire / d'intégration pour une route.
Être capable de tester des modules simples est facile et je l'ai fait avec Mocha ; cependant, mes tests unitaires avec Express échouent car l'objet de réponse que je transmets ne conserve pas les valeurs.
Route-Function Under Test (routes / index.js):
exports.index = function(req, res){
res.render('index', { title: 'Express' })
};
Module de test unitaire:
var should = require("should")
, routes = require("../routes");
var request = {};
var response = {
viewName: ""
, data : {}
, render: function(view, viewData) {
viewName = view;
data = viewData;
}
};
describe("Routing", function(){
describe("Default Route", function(){
it("should provide the a title and the index view name", function(){
routes.index(request, response);
response.viewName.should.equal("index");
});
});
});
Quand j'exécute ceci, cela échoue pour "Erreur: fuites globales détectées: viewName, data".
Où est-ce que je vais mal pour que je puisse faire fonctionner cela?
Existe-t-il un meilleur moyen pour moi de tester mon code unitaire à ce niveau?
Mise à jour 1. Extrait de code corrigé depuis que j'ai initialement oublié "it ()".
Comme d'autres l'ont recommandé dans les commentaires, il semble que la manière canonique de tester les contrôleurs Express consiste à effectuer un super test .
Un exemple de test pourrait ressembler à ceci:
À l'inverse: vous pouvez tester l'intégralité de votre stack en une seule fois.
Inconvénient: cela ressemble et agit un peu comme des tests d'intégration.
la source
integration
, et peut-être que les routes de test devraient être laissées aux tests d'intégration. Je veux dire, la fonctionnalité des routes correspondant à leurs rappels définis est probablement déjà testée par express.js; toute logique interne pour obtenir le résultat final d'une route devrait idéalement être modulaire à l'extérieur de celle-ci, et ces modules devraient être testés à l'unité. Leur interaction, c'est-à-dire l'itinéraire, doit être testée en intégration. Accepteriez-vous?J'en suis venu à la conclusion que la seule façon de vraiment tester les applications expresses unitaire est de maintenir une grande séparation entre les gestionnaires de requêtes et votre logique de base.
Ainsi, la logique de votre application doit se trouver dans des modules séparés qui peuvent être
require
testés d et unitaire, et dépendre au minimum des classes Express Request et Response en tant que telles.Ensuite, dans les gestionnaires de requêtes, vous devez appeler les méthodes appropriées de vos classes logiques de base.
Je donnerai un exemple une fois que j'aurai fini de restructurer mon application actuelle!
Je suppose que quelque chose comme ça? (N'hésitez pas à donner l'essentiel ou à commenter, j'explore toujours cela).
Éditer
Voici un petit exemple, en ligne. Voir l'essentiel pour un exemple plus détaillé.
la source
Le moyen le plus simple de tester HTTP avec express est de voler l'assistant http de TJ
J'utilise personnellement son aide
Si vous souhaitez tester spécifiquement votre objet routes, passez des simulations correctes
la source
si les tests unitaires avec express 4 notez cet exemple de gjohnson :
la source
Je me posais la question aussi, mais spécifiquement pour les tests unitaires et non pour les tests d'intégration. C'est ce que je fais en ce moment
Où le routerObj est juste
{router: expressRouter, path: '/api'}
. Je charge ensuite des sous-routeurs avecvar loginRouterInfo = require('./login')(express.Router({mergeParams: true}));
, puis l'application express appelle une fonction init prenant le routeur express comme paramètre. L'initRouter appelle ensuiterouter.use(loginRouterInfo.path, loginRouterInfo.router);
pour monter le sous-routeur.Le sous-routeur peut être testé avec:
la source
Pour réaliser des tests unitaires au lieu des tests d'intégration, je me suis moqué de l'objet de réponse du gestionnaire de requêtes.
Ensuite, pour réaliser les tests d'intégration, vous pouvez simuler votre endpointHandler et appeler le point de terminaison avec supertest .
la source
Dans mon cas, le seul que je voulais tester est si le bon gestionnaire a été appelé. Je voulais utiliser supertest pour profiter de la simplicité de faire des requêtes au middleware de routage. J'utilise Typescript a et c'est la solution qui a fonctionné pour moi
Les routes
Les tests
J'ai eu quelques problèmes pour que la moquerie fonctionne. mais en utilisant jest.doMock et l'ordre spécifique que vous voyez dans l'exemple le fait fonctionner.
la source