我使用express.js创建了一个简单的 Webapp ,并希望使用jasmine-node对其进行测试。到目前为止工作正常,但我的问题是我必须每次手动启动服务器才能运行我的测试。
您能否帮助我编写一个运行服务器的规范助手(使用另一个端口,然后是我的开发端口)仅用于测试,然后将其杀死?
我使用express.js创建了一个简单的 Webapp ,并希望使用jasmine-node对其进行测试。到目前为止工作正常,但我的问题是我必须每次手动启动服务器才能运行我的测试。
您能否帮助我编写一个运行服务器的规范助手(使用另一个端口,然后是我的开发端口)仅用于测试,然后将其杀死?
这就是我所做的:
我的节点项目的根目录中有一个server.js文件,它设置节点应用程序服务器(使用 express)并导出 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/whatever 任务),如下所示:
/** 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();
}
});
我使用 Mocha——这该死的相似——但同样的原则应该适用:你可以尝试在 main 内的 'beforeEach' 钩子中require
输入你的文件。那应该为你点燃它。app.js
describe
假设您使用一些在 server.js 中调用的代码app.listen()
,则不需要每次运行时都需要该文件,而只需要一次,然后有两个函数,例如
startServer = -> app.listen(3000)
stopServer = -> app.close()
然后你可以在beforeEach
和afterEach
如果您想在开发时进一步自动化测试,您可以转到终端线并执行
jasmine-node . --autotest
然后 Jasmine 将继续监听您项目中的每个文件,并且每当您对其中一个文件进行更改时,它都会告诉您该代码是否破坏了您的任何测试;)