【问题标题】:Cannot get node js test to fail无法让节点 js 测试失败
【发布时间】:2016-04-01 22:33:00
【问题描述】:

我的文件结构是这样的

文件夹主目录

-server.js

-文件夹测试

--serverTest.js

var expect = require("chai").expect;
var http = require('http')

describe('/', function(){
    var server;
    beforeEach(function () {
        server = require('../server');
    });

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

    it('should return 200 status code', function(){
        http.get("http://localhost:8080", function(res) {
            console.log("Got response: " + res.statusCode);
            expect(res.statusCode).to.equal("This isnt even a number")
        })
    })
})

和 server.js 是

var express = require('express');
var app = express();
var http = require('http');
var server = http.createServer(app);
var io = require('socket.io').listen(server);

var port = 8080;
server.listen(port);
console.log("listening on port " + port)

// router
app.get('/', function (req, res){
    res.writeHead(200, {"Content-Type": "text/plain"});
    res.end("Hello World\n");
});

module.exports = server;

当我从 cmd 行运行“mocha test”时,我得到

 ✓ should return 200 status code
    1) "after each" hook


  1 passing (277ms)   1 failing

  1) / "after each" hook:
     Uncaught Error: connect ECONNRESET
      at errnoException (net.js:904:11)
      at Object.afterConnect [as oncomplete] (net.js:895:19)

我很困惑

  1. 第一个测试应该失败,因为它与“This is not even a number”比较。

  2. 我不确定 Uncaught Error: connect ECONNRESET 发生了什么

【问题讨论】:

    标签: node.js mocha.js


    【解决方案1】:

    如果你是testing asynchronous code,Mocha 测试需要使用done() 回调,否则 mocha 将在你的断言运行之前完成,并且不会检测到失败。

    it('should return 200 status code', function(done){
        http.get("http://localhost:8080", function(res) {
            console.log("Got response: " + res.statusCode);
            expect(res.statusCode).to.equal("This isnt even a number")
            done()
        })
    })
    

    done 被设置为您的测试函数的第一个参数,然后您在断言之后调用它。如果done函数没有被调用,mocha会在默认2秒后超时测试。

    这也可能会解决您的ECONNRESET 问题,因为您的服务器没有在测试/请求中关闭。

    即使在测试同步代码时,始终使用done() 也会有所帮助,这样您以后就不会陷入这个陷阱。误报可能会导致数小时的故障排除痛苦。

    【讨论】:

    • 感谢 Matt 富有洞察力的评论。您已正确识别问题并将 done 传递给最外层函数并在 http.get() 函数中调用它会导致测试失败。祝你有美好的一天!
    猜你喜欢
    • 2020-05-02
    • 1970-01-01
    • 1970-01-01
    • 2017-11-15
    • 2017-06-23
    • 2019-07-13
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多