【问题标题】:Automate Jasmine-Node and express.js自动化 Jasmine-Node 和 express.js
【发布时间】:2016-12-19 21:04:35
【问题描述】:

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

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

【问题讨论】:

  • 你运行的是什么版本的 express?
  • 我使用的是 3.x 版本(现在是 3.0.2)。

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


【解决方案1】:

这就是我的工作:

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

【讨论】:

  • 好的,我知道了。如果你现在告诉我如何摆脱我的测试输出中的服务器输出(例如:GET / 200 46ms - 167),一切都很好:)
  • 似乎您在节点服务器应用程序中配置了一些记录请求的东西,也许是用于 express 的分析器中间件?检查您的快速服务器代码;)
  • 抱歉,发现忘记了 app.use(express.logger('dev'));谢谢^^
  • 别担心,输出看起来很熟悉 ;D
  • 我想补充一点,server.close() 可能由于另一个子系统未关闭而失败。让我发疯,单元测试触发了数据库,所以单元测试单独终止,服务器单独终止但一起,导致单元测试打开数据库(是的,我知道,嘲笑,......)服务器进程没有关闭服务器后不再终止。
【解决方案2】:

我使用 Mocha - 这非常相似 - 但应该适用相同的原则:您可以尝试在主 describe 内的 'beforeEach' 挂钩中 requireing 你的 app.js 文件。这应该会为你点燃它。

【讨论】:

  • 好的,然后它会启动并且测试正在运行,但是如果我使用 --autotest 选项(或执行类似操作)它不会停止并失败,如果我只想运行它不会停止测试一次。最重要的是,我现在的测试输出中有 http 输出 (GET / 200 6ms - 167)。我该如何摆脱它?
  • 你有这方面的例子吗?
  • 这里是一个输出示例:pastebin.com/9qF1NeU1,这里是 server_spec.coffee:pastebin.com/uvcBuTiy
【解决方案3】:

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

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

然后你可以在beforeEachafterEach中使用这些

【讨论】:

  • 无法正常工作,@ShadowCloud 的 sn-p 很好 :)
【解决方案4】:

如果您想在开发时进一步自动化测试,您可以转到终端行并执行

jasmine-node . --autotest

Jasmine 然后会继续监听您项目中的每个文件,并且每当您对其中一个文件进行更改时,它会判断您的那段代码是否会破坏您的任何测试;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-11
    • 2020-06-26
    • 2020-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多