无法让节点js测试失败

时间:2015-12-28 03:33:00

标签: node.js mocha

我的文件结构是这样的

folder_main

-server.js

-folder_tests

- 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行

 ✓ 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. 第一次测试应该失败,因为它与&#34相比;这甚至不是数字"。

  2. 我不确定Uncaught Error会发生什么:连接ECONNRESET

1 个答案:

答案 0 :(得分:3)

如果你是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(),因此您将来不会陷入此陷阱。误报可能导致数小时的疼痛。