自动化Jasmine-Node和express.js

时间:2012-11-01 11:38:48

标签: node.js tdd express jasmine jasmine-node

我使用express.js创建了一个简单的Web应用程序,并希望使用jasmine-node进行测试。到目前为止工作正常但我的问题是我必须每次手动启动服务器才能运行我的测试。

你能帮助我编写一个运行服务器的规范帮助程序(使用另一个端口,然后是我的开发程序),仅用于测试,然后将其杀死吗?

4 个答案:

答案 0 :(得分:17)

这就是我的所作所为:

我的节点项目根目录中有一个 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();
    }
});

答案 1 :(得分:0)

我使用摩卡 - 这是相似的 - 但同样的原则应该适用:你可以在主require内的'beforeEach'钩子中尝试app.js你的describe文件。那应该为你解雇。

答案 2 :(得分:0)

假设您使用了一些在server.js中调用app.listen()的代码,请不要在每次运行时都需要该文件但只需要一次,然后有两个函数,如

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

然后您可以在beforeEachafterEach

中使用这些内容

答案 3 :(得分:-1)

如果您希望在开发过程中更进一步自动化测试,可以转到终端并执行

jasmine-node . --autotest

然后,Jasmine将继续监听项目中的每个文件,无论何时对其进行更改,都会告诉您该代码是否会破坏您的任何测试;)