Автоматизируйте Jasmine-Node и express.js

Я создал простое веб-приложение с использованием express.js и хочу проверить его с помощью jasmine-node. Пока работает нормально, но моя проблема в том, что мне приходится каждый раз запускать сервер вручную, прежде чем я смогу запустить свои тесты.

Не могли бы вы мне помочь, как написать спецификатор-помощник, который будет запускать сервер (с другим портом, а не с моим портом разработки) только для тестов, а затем убивать его?

4 ответа

Решение

Вот что я делаю:

У меня есть файл server.js внутри корня моего проекта узла, который настраивает сервер приложений узла (с экспресс) и экспортирует 2 метода:

exports.start = function( config, readyCallback ) {

    if(!this.server) {

        this.server = app.listen( config.port, function() {

            console.log('Server running on port %d in %s mode', config.port, app.settings.env);

            // callback to call when the server is ready
            if(readyCallback) {
                readyCallback();
            }
        });
    }
};

exports.close = function() {
    this.server.close();
};

Файл app.js будет простым на этом этапе:

var server = require('./server');
server.start( { port: 8000 } );

Таким образом, базовая структура файлов / папок будет следующей:

src
   app.js
   server.js

Наличие этого разделения позволит вам нормально запустить сервер:

node src/app.js

..и / или требовать его из пользовательского скрипта узла, который может быть скриптом узла (или задачей jake/grunt/ любой другой), которая выполняет ваши тесты следующим образом:

/** my-test-task.js */

// util that spawns a child process
var spawn = require('child_process').spawn;

// reference to our node application server
var server = require('./path/to/server.js');

// starts the server
server.start( { port: 8000 }, function() {

    // on server ready launch the jasmine-node process with your test file
    var jasmineNode = spawn('jasmine-node', [ '.path/to/test/file.js' ]);

    // logs process stdout/stderr to the console
    function logToConsole(data) {
        console.log(String(data));
    }
    jasmineNode.stdout.on('data', logToConsole);
    jasmineNode.stderr.on('data', logToConsole);

    jasmineNode.on('exit', function(exitCode) {
        // when jasmine-node is done, shuts down the application server
        server.close();
    }
});

Предполагая, что вы используете некоторый код, который вызывает app.listen() в server.js не требуется файл при каждом запуске, а только один раз, а затем есть две функции, такие как

startServer = -> app.listen(3000)
stopServer = -> app.close()

Тогда вы можете использовать их в beforeEach а также afterEach

Я использую Мокко - что чертовски похоже - но тот же принцип должен применяться: вы могли бы попробовать requireв ваш app.js файл в хуке beforeEach внутри основного describe, Это должно запустить это для вас.

Если вы хотите сделать еще один шаг в автоматизации вашего тестирования во время разработки, вы можете перейти к своей терминальной линии и выполнить

jasmine-node . --autotest

Затем Jasmine будет слушать все файлы внутри вашего проекта и всякий раз, когда вы вносите изменения в один из них, он будет сообщать, нарушает ли этот фрагмент кода какой-либо из ваших тестов;)

Другие вопросы по тегам