2015-05-30 5 views
0

У меня есть следующий модуль, над которым я работаю над добавлением модульных тестов. В основном я хочу, чтобы приложение app.use вызывалось с/и соответствующим обработчиком this.express.static('www/html'), я также хочу убедиться, что app.listen вызывается с правильным портом.Тестирование модуля expressjs application

function WebService(express, logger) { 
    this.express = express; 
    this.log = logger; 
    this.port = 3000; 
} 

// init routes and start the server 
WebService.prototype.start = function start() {  
    var app = this.express(); 

    // Setup routes 
    app.use('/', this.express.static('www/html')); 

    // Startup the server 
    app.listen(this.port); 

    this.log.info('Starting webserver on port %s', this.port); 

}; 

module.exports = WebService; 

Если удалить app.use (заменить с помощью простого app.get) я могу получить Слушающиеся тестирование, передавая это в конструктор в тесте

var express_stub = function() { 
       var tmpObj = { 
        get: function() {}, 
        listen: listen_stub // sinonjs stub 
       }; 
       return tmpObj; 
      }; 

единичном Когда я переключаться к использованию this.express.static в пути, это падает (предположительно потому, что this.express не определяет статические). Я не могу получить свою голову, обернутую вокруг правильного способа справиться с этим. this.express() как конструктор действительно меня бросает. Я не могу понять правильный способ издеваться над вызовами, которые я хочу проверить в экспресс.

ответ

1

Вы можете использовать Supertest

var request = require('supertest') 
    , express = require('express'); 

var app = express(); 

app.get('/user', function(req, res){ 
    res.send(200, { name: 'tobi' }); 
}); 

request(app) 
    .get('/user') 
    .expect('Content-Type', /json/) 
    .expect('Content-Length', '20') 
    .expect(200) 
    .end(function(err, res){ 
if (err) throw err; 
    }); 

Использование Мокко:

describe('GET /users', function(){ 
    it('respond with json', function(done){ 
    request(app) 
     .get('/user') 
     .set('Accept', 'application/json') 
     .expect('Content-Type', /json/) 
     .expect(200, done); 
    }) 
}) 

Я предлагаю вам разделить на два файла приложение: в app.js, который содержит весь код приложения и вернуть его module.exports и файл server.js, который требует app.js и передает его новому методу прослушивания HTTP-сервера. Таким образом вы можете написать тесты, требующие приложения app.js.

Так работает приложение по умолчанию, созданное с помощью экспресс-генератора.

+1

Colonnello Я предполагаю, что тестирование устройства, если оно отличается от тестирования интеграции ... этот пример является интеграционным тестом –

+0

P.M вы правы. Я был не слишком ясен. Это не модульное тестирование, а способ тестирования на маршрут, наиболее используемый в экспресс-разработке, но я также выполняю модульные тесты в экспресс-приложении, поэтому мой ответ не является неправильным, но неполным, я думаю .. –

Смежные вопросы