【问题标题】:Mocha-Express unit test fails with localhost as URLMocha-Express 单元测试以 localhost 作为 URL 失败
【发布时间】:2015-06-24 13:37:39
【问题描述】:

我编写了以下脚本(server.js):

var express = require('express'),
    app = express(),
    server;

app.get('/', function (request, response) {
  response.send('This is the main page.\n');});

exports.listen = function (port){
    server = app.listen(port, function () {
    console.log('Server available listening at: ' + port);}) };

exports.close = function () {
  server.close(function (){
    console.log('Server Closed')}); };

以及以下 Mocha 单元测试(test.js):

var server = require ('./server'),
    assert = require ('assert'),
    http = require ('http');
var port = 8085;

describe('server', function () {
  before(function () {
    server.listen(port)});

  after(function () {
    server.close();}); });

describe('Server status and Message', function () {
  it('status response should be equal 200', function (done) {
    http.get('http://127.0.0.1:8085', function (response) {
         assert.equal(response.statusCode, 200);
        done(); }); }); }); 

当我运行 test.js 将“localhost:8085”或“127.0.0.1:8085”传递给 http 客户端时,无论端口如何,Mocha 都会显示以下错误:

1) Server status and Message status response should be equal 200:
     Uncaught Error: connect ECONNREFUSED
      at exports._errnoException (util.js:746:11)
      at TCPConnectWrap.afterConnect [as oncomplete] (net.js:983:19)

但我可以通过 http 客户端使用相同的 localhost url (listener.js) 完美地连接服务器:

var server = require('./server');
var http = require('http');

    var url = 'http://localhost:8085';
    var content = function(response){
        response.setEncoding("utf8");       
        response.on("data", function(data) {
                console.log(data)});}

    server.listen(8085);
    setTimeout(function (){server.close();}, 3000)

    http.get(url, content);

我已尝试使用其他互联网网址作为“https://www.google.com.co/”运行单元测试(测试未通过但有效)并且测试运行正常。

你能帮我解决这个问题吗?非常感谢。

【问题讨论】:

    标签: testing express localhost server mocha.js


    【解决方案1】:

    您不小心运行了两组测试。将第二个 describe() 移到第一个内部,这样它就可以依赖 before() 钩子,如下所示:

    var server = require ('./server'),
        assert = require ('assert'),
        http = require ('http');
    var port = 8085;
    
    describe('server', function () {
        before(function () {
            server.listen(port);
        });
    
        after(function () {
            server.close();
        });
    
        describe('Server status and Message', function () {
          it('status response should be equal 200', function (done) {
                http.get('http://127.0.0.1:8085', function (response) {
                      assert.equal(response.statusCode, 200);
                      done();
                });
           });
        });
    });
    

    【讨论】:

    • 成功了!但我记得原始代码(作为我的问题)工作了一段时间。我从here 那里得到它。我想知道为什么现在根据您的建议,它起作用了,而且,将描述放入其他描述中是正确的吗?非常感谢!
    • 它有时可能由于竞争条件而工作(也就是说,服务器能够在测试运行之前启动,这在您发布的代码中并不保证发生)。通过使用 before(),我们保证服务器将首先启动。 describe() 只是一种将您的测试组合在一起的方法,因此在您认为合适的情况下将它们放在下一个是完全可以接受的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 2017-03-23
    相关资源
    最近更新 更多