2016-02-05 20 views
18

Jestem nowy w Node i Express i próbuję przetestować moje trasy/kontrolery. Oddzieliłem moje trasy od kontrolerów. Jak mam testować trasy?Jak testować urządzenie ekspresowe trasy routera

konfiguracji/express.js

var app = express(); 
    // middleware, etc 
    var router = require('../app/router')(app); 

APP/router/index.js

module.exports = function(app) { 
    app.use('/api/books', require('./routes/books')); 
    }; 

APP/router/trasy/books.js

var controller = require('../../api/controllers/books'); 
    var express = require('express'); 
    var router = express.Router(); 

    router.get('/', controller.index); 

    module.exports = router; 

app/api/controllers/books.js

// this is just an example controller 
exports.index = function(req, res) { 
    return res.status(200).json('ok'); 
}; 

app/tests/api/Trasy/books.test.js

var chai = require('chai'); 
    var should = chai.should(); 
    var sinon = require('sinon'); 

    describe('BookRoute', function() { 

    }); 
+1

Możliwy duplikat [W jaki sposób jedna jednostka testuje trasy za pomocą Express?] (Http://stackoverflow.com/questions/9517880/how-does-one-unit-test-routes-w-express) – gnerkus

+0

Nie duplikat , powiązane pytanie dotyczy starszej wersji Express, która ma inne API. – Kos

+0

Użyj tego [Link] (http://www.designsuperbuild.com/blog/unit_testing_controllers_in_express/) lub tego [Link] (http://www.chrisstead.com/archives/1128/unit-testing-express-routing/). –

Odpowiedz

1

znalazłem this blog niezwykle wnikliwe podczas testowania moje własne punkty końcowe serwerów.

W blogu Zwraca się:

  • Jak korzystać z punktów końcowych badania biblioteki supertest.

  • Jak programowo rozpędzają i zburzyć serwer wyraźnej ze swoimi potrzebnych dróg przed i po każdym teście końcowym. (wyjaśnia również, dlaczego chciałbyś to zrobić).

  • Jak uniknąć wspólnego Gotcha wymagają buforowanie modułów wymaganych w badaniach jednostkowych, co prowadzi do niezamierzonych konsekwencji.

Mam nadzieję, że to pomoże. Powodzenia i jeśli masz więcej pytań, daj mi znać.

+3

W blogu znajduje się kilka ładnych przykładów na to, jak używać supertest do testowania punktów końcowych API. Jednak uważam, że niektóre komentarze są potrzebne, ponieważ nie zgadzam się z autorem w pełni. Uruchamianie i zatrzymywanie serwera między każdym testem jest złym projektem. Jeśli jest to RESTful API, który testujesz, serwer powinien i tak być bezstanowy. Jeśli jest to aplikacja ze stanem, możesz zniszczyć sesję pomiędzy poszczególnymi testami, aby osiągnąć to samo. Wydaje się również, że autor nie rozumie, w jaki sposób działa stos JavaScript, co prowadzi go do nieprawidłowych wniosków. –

7

KOD:

konfiguracyjne/express.js

var app = express(); 
// middleware, etc 
var router = require('../app/router')(app); 

module.exports = app; 

app// testów API/trasy/books.test.js

var chai = require('chai'); 
var should = chai.should(); 
var sinon = require('sinon'); 
var request = require('supertest'); 
var app = require('config/express'); 

describe('BookRoute', function() { 
    request(app) 
     .get('/api/books') 
     .expect('Content-Type', /json/) 
     .expect('Content-Length', '4') 
     .expect(200, "ok") 
     .end(function(err, res){ 
      if (err) throw err; 
     }); 
}); 

czynniki:

Jeśli yo twój serwer wymaga stanu początkowego na początku zestawu testów (ponieważ wykonujesz połączenia modyfikujące stan serwera), musisz napisać funkcję, która zwróci świeżo skonfigurowaną aplikację i początek każdej grupy testów . Istnieje biblioteka NPM: https://github.com/bahmutov/really-need, która pozwoli ci wymagać świeżo utworzonej wersji twojego serwera.

1

Jest to interesujące, ponieważ oddzieliłeś kontrolery od routerów. Drugi artykuł StackOverflow wspomniany w komentarzach jest dobrym sposobem na przetestowanie kontrolerów.Trzeba pamiętać o testach jednostkowych, co dokładnie testujesz. Nie trzeba pisać testów, aby przetestować bibliotekę ekspresową, ponieważ prawdopodobnie ma ona własne testy jednostkowe. Musisz przetestować swoje połączenia z biblioteką. Tak na trasie książek, wystarczy przetestować tę jedną linię kodu:

router.get('/', controller.index); 

Rozejrzałem się, aby zobaczyć, czy nie było oczywistym sposobem, aby uzyskać listę tras z wyraźną biblioteki, ale nie zrobił” t zobaczyć jeden. Prawdopodobnie możesz po prostu spojrzeć na samą bibliotekę i sprawdzić jej wnętrze, aby sprawdzić, czy poprawnie ustawiłeś trasę. Inną opcją jest udowodnić to i po prostu sprawdzić, czy dzwonisz poprawnie.

Będzie to dość skomplikowane, ponieważ trzeba przetestować niektóre podstawowe elementy Javascriptu, aby przetestować tę jedną linię kodu. Oto jak to zrobiłem:

describe('BookRoute', function() { 
    it("should route/to books controller index", function() { 
    var controller = require('../../../api/controllers/books'); 
    var orig_this = this; 
    var orig_load = require('module')._load; 
    var router = jasmine.createSpyObj('Router', ['get']); 
    var express = jasmine.createSpyObj('express', ['Router']); 
    express.Router.and.returnValues(router); 
    spyOn(require('module'), '_load').and.callFake(function() { 
     if (arguments[0] == 'express') { 
     return express; 
     } else { 
     return orig_load.apply(orig_this, arguments); 
     } 
    }); 
    require("../../../router/routes/books"); 
    expect(router.get).toHaveBeenCalledWith('/', controller.index); 
    }); 
}); 

Co się tutaj dzieje to użyłem funkcji spyOn Jasmine do spyOn funkcję _load w module.js która jest co obsługuje wszystkich połączeń wymagających. Jest tak, że gdy wymagamy od routera książek i wywołań require ("express"), możemy zwrócić nasz ekspresowy SpyObj, który stworzyliśmy za pomocą jaśminu.createSpyObj. Po wymianie ekspresu z naszym obiektem szpiegowskim możemy przywrócić nasz router SpyObj, który pozwoli nam szpiegować router.get. Następnie możemy sprawdzić, czy jest wywoływana za pomocą "/" i controller.index.

Prawdopodobnie może się to stać pewnym narzędziem, jeśli chcesz dużo z niego korzystać.

Zwykle omijam dużo tego, używając bardziej zorientowanego obiektowo podejścia, albo albo przechodzę wokół jakiegoś obiektu wszędzie, gdzie mogę kpić dla testów, albo możesz użyć jakiegoś rodzaju zastrzyku zależności, jak w przypadku Angular.