тестирование node.js с экспресс-хранилищем сессии - PullRequest
3 голосов
/ 28 марта 2011

Я пытаюсь изучить TDD с помощью node.js.Я столкнулся с этой проблемой в экспрессе, где просто висит команда expresso, я думаю из-за сервера redis.Уничтожение процесса с помощью ctrl+C в итоге дает искомый результат (100% пройдено 3 теста).

Что вызывает зависание команды expresso и что я могу с этим сделать?*

Мое приложение выглядит так:

// Module dependencies.

var auth = require('connect-auth'),
    RedisStore = require('connect-redis');


var express = require('express');
var app = module.exports = express.createServer();

// Configuration

app.configure(function(){
  app.set('views', __dirname + '/views');
  app.set('view engine', 'jade');
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(express.cookieParser());
  app.use(express.session({ store: new RedisStore, secret: "secret goes here" }));
  app.use(app.router);
  app.use(express.static(__dirname + '/public'));
});

app.configure('development', function(){
  app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); 
});

app.configure('production', function(){
  app.use(express.errorHandler()); 
});

// Routes

app.get('/', function(req, res){
  res.render('index', {
    title: 'Orchestrate'
  });
});

app.get('/login', function(req, res){
  res.render('user/login', {
    title: 'Login'
  });
});

app.get('/register', function(req, res){
  res.render('user/login', {
    title: 'Register'
  });
});

// Only listen on $ node app.js

if (!module.parent) {
  app.listen(3000);
  console.log("Express server listening on port %d", app.address().port);
}

И мои тесты:

// Run $ expresso

/**
 * Module dependencies.
 */

var app = require('../app'),
    assert = require('assert');


module.exports = {
  'GET /': function(){
    assert.response(app,
      { url: '/' },
      { status: 200, headers: { 'Content-Type': 'text/html; charset=utf-8' }},
      function(res){
        assert.includes(res.body, '<title>Orchestrate</title>');
      });
  },
  'GET /login': function(){
    assert.response(app,
      { url: '/login' },
      { status: 200, headers: { 'Content-Type': 'text/html; charset=utf-8' }},
      function(res){
        assert.includes(res.body, '<title>Login</title>');
      });
  },
  'GET /register': function(){
    assert.response(app,
      { url: '/register' },
      { status: 200, headers: { 'Content-Type': 'text/html; charset=utf-8' }},
      function(res){
        assert.includes(res.body, '<title>Register</title>');
      });
  }

};

Ответы [ 5 ]

4 голосов
/ 04 апреля 2011

Попробуйте написать свои тесты следующим образом, и бегущий тест должен завершиться сам, когда все тесты будут завершены:

  'GET /': function(done){
    assert.response(app,
      { url: '/' },
      { status: 200, headers: { 'Content-Type': 'text/html; charset=utf-8' }},
      function(res){
        assert.includes(res.body, '<title>Orchestrate</title>');

        done();
      });
3 голосов
/ 02 мая 2011

Ответ в том, что Mongoose не закрывает сами соединения, что вызывает проблемы при использовании expresso.

Вам необходимо добавить mongoose.disconnect (), например Я всегда добавляю шаг «снос» в конце:

    tearDown: function(done){
       mongoose.disconnect();
       done();
    }

Надеюсь, это поможет.

1 голос
/ 17 апреля 2011

У меня такая же проблема с

mongoose.connect();

Экспресс-тесты завершаются, как и ожидалось, до тех пор, пока я не подключаюсь к БД, в противном случае мне нужно завершить процесс, чтобы увидеть результаты.

1 голос
/ 28 марта 2011

Проблема в том, что утверждения печатаются после асинхронных вызовов.Ваши тесты не зависают из-за connect-redis, они просто не знают, когда все ваши тесты пройдены.

0 голосов
/ 05 января 2012

Для людей, решающих эту проблему в будущем, похоже, что преемник Expresso под названием Мокко решает эту проблему. Он поддерживает истинные функции инициализации и разрыва, а также обратный вызов Done () для решения проблемы асинхронного завершения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...