92 votes

Comment fonctionne une unité itinéraires de test avec Express?

Je suis dans le processus d'apprentissage Node.js et ont été jouer avec Express. Vraiment comme le cadre de référence;cependant, je vais avoir de la difficulté à trouver comment écrire une unité/d'un test d'intégration pour une route.

Être en mesure de l'unité de test de modules simples est facile et l'ont fait avec Moka; cependant, mes tests unitaires avec Express échoue, car l'objet de la réponse je suis de passage à ne pas conserver les valeurs.

Fonction Route Sous Test (routes/index.js):

exports.index = function(req, res){
  res.render('index', { title: 'Express' })
};

Unité De Module De Test:

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");
        });

    });
});

Lorsque je l'exécute, il ne parvient pas pour "Erreur: global des fuites détectées: nomvue, les données".

  1. Où vais-je tort de sorte que je peux obtenir ce travail?

  2. Est-il un meilleur moyen pour moi d'unité de tester mon code à ce niveau?

Mise à jour 1. Corrigé extrait de code depuis au départ, j'ai oublié " ()".

36voto

Rich Apodaca Points 7327

Comme d'autres l'ont recommandé, dans les commentaires, il semble que la manière canonique de test Express contrôleurs est par le biais de supertest.

Un exemple de test pourrait ressembler à ceci:

describe('GET /users', function(){
  it('respond with json', function(done){
    request(app)
      .get('/users')
      .set('Accept', 'application/json')
      .expect(200)
      .end(function(err, res){
        if (err) return done(err);
        done()
      });
  })
});

À l'envers: vous pouvez tester votre tapis entier en une seule fois.

Inconvénient: il se sent et agit un peu comme les tests d'intégration.

20voto

Linus G Thiel Points 18378

Changer votre objet de réponse:

var response = {
    viewName: ""
    , data : {}
    , render: function(view, viewData) {
        this.viewName = view;
        this.data = viewData;
    }
};

Et il va fonctionner.

19voto

Raynos Points 82706

La façon la plus simple pour tester HTTP avec express est de voler TJ http helper

J' utilise personnellement son aide

it("should do something", function (done) {
    request(app())
    .get('/session/new')
    .expect('GET', done)
})

Si vous voulez testez vos itinéraires objet, puis passer dans le bon se moque de

describe("Default Route", function(){
    it("should provide the a title and the index view name", function(done){
        routes.index({}, {
            render: function (viewName) {
                viewName.should.equal("index")
                done()
            }
        })
    })
})

19voto

Luke H Points 810

Je suis venu à la conclusion que la seule façon de vraiment de test de l'unité express applications est de maintenir un grand nombre de séparation entre les gestionnaires de demandes et de votre logique de base.

Ainsi, la logique de l'application doivent être dans des modules distincts qui peuvent être required et de l'unité testée, et ayant un minimum de dépendance sur la Demande Expresse et Réponse en cours en tant que tels.

Puis, à la demande des gestionnaires, vous devez appeler les méthodes appropriées de votre cœur de la logique des classes.

Je vais mettre un exemple une fois j'ai terminé la restructuration de mon application!

Je suppose que quelque chose comme cela? (N'hésitez pas à fourche de l'essence ou un commentaire, je suis encore à explorer cette).

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