为什么我得到这个错误:在编写mocha js test时连接ECONNREFUSED 127.0.0.1:3000

时间:2017-07-17 08:48:47

标签: unit-testing mocha

我已经采用了一个名为f.js的随机nodejs代码并为此编写单元测试。 节点js代码在下面,

//storing the information in temporary memory
var http = require("http");
var url = require("url");
var parsedUrl = url.parse('/itemsAvailable?model=nokia', true)
//	href: '/itemsAvailable?model=nokia',
//search: '?model=nokia',
//query: {model: 'nokia'},
//pathname: '/itemsAvailable'


//information of the user 
function reset() {
  var d = new Date();
  var date = d.getDate();
  var hour = d.getHours();
  var min = d.getMinutes();
  //var time = hour + ':'+min;
  //console.log(date,itemsAvailable[2].count,itemsAvailable[2].userId);

  if (hour == 16 && min == 52) {
    itemsAvailable[2].count = 0;
  }
}
exports.reset = reset;

var itemsAvailable = [{
    model: 'nokia',

    available: 10
  },
  {
    model: 'samsung',
    available: 20
  },
  {
    userId: 1234,
    count: 0, //initially assigning count to 0 
    model: "",

  }
]; //create an object to store the itemsAvailable
exports.itemsAvailable = itemsAvailable;

var server = http.createServer(function(req, res) {
  reset(); //calling the reset after every request
  res.write("hello\n");
  if (itemsAvailable[2].count == 0) {
    if (parsedUrl.query.model === 'nokia' && itemsAvailable[0].available != 0) { //parsedUrl.query gives an object and .model gives nokia
      res.write("item chosen is nokia\n")
      res.write("item can be bought");
      itemsAvailable[2].count++; // increasing the num of mobiles bought 
      console.log(itemsAvailable[2].count);
      itemsAvailable[0].available--;
      console.log(itemsAvailable[0].available)

    }
  } else {
    res.write("u cannot buy the item today come back tomorrow");
  }

  res.end()
}).listen(3000);

exports.server = server;

我写的测试代码在下面

var assert = require("chai").assert;

var http = require("http");

var Code = require("../f");


describe("itemsAvailable", function() {
  it("information count", function() {
    assert.equal(Code.itemsAvailable[2].count, 0);
  })

});


describe("information count", function() {
  it("reset", function() {
    if (Code.reset.hour == 16 && Code.reset.min == 52) {
      assert.equal(Code.reset.itemsAvailable[2].count, 0);
    }
  });
})



describe('/', function() {

  before(function(done) {
    Code.server.listen(3000, done);
  });

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

  describe("http request", function() {

    it('buy the item', function(done) {

      http.get("http://localhost:3000", function(res) {

        //assert.equal(Code.server.res,'hello');
        try {
          if (Code.itemsAvailable[2].count == 0) {
            if (Code.parsedUrl.query.model == 'nokia' && Code.itemsAvailable[0].available != 0) {

              it("item can be bought", function(done) {
                assert.equal(Code.server.res, 'item chosen is nokia');
                assert.equal(Code.server.res, 'item can be bought');
                done();
              })
            }
          };
        } catch (error) {
          it("item can not be bought", function(done) {
            assert.equal(Code.server.res, 'u cannot buy the item today come back tomorrow');
            done();
          })
        }
      })
      done();
    })

  });
})

我得到了错误

  

3次传球,1次失败   1)毕竟钩子未被捕获错误:错误econnrefused 127.0.0.1:3000

我正在听3000端口。只有nodejs代码可以正常工作。我刚刚开始学习摩卡单元测试,有人可以解释为什么会出现这种错误,并且可以在上面的单元测试代码中做出哪些改变来摆脱错误。

1 个答案:

答案 0 :(得分:1)

您的代码中存在多个错误:

  1. 您无法嵌套it次来电。 Mocha根本不支持这样的嵌套,如果你尝试它会表现不正常。

  2. 在测试buy the item中,您致电done 以外的回复http.get。这是错的。它会导致您的测试过早结束。

    是导致错误的直接原因。问题是http.get仅保证将来某个未确定点的结果 。通过提前完成测试,Mocha会转到你的after钩子。 (嵌套在it测试中的两个buy the item测试无关紧要:此时Mocha甚至知道关于这些嵌套测试。)所以Mocha认为你的测试完成,并执行关闭服务器的after挂钩,然后执行 ,它会尝试运行由于服务器关闭而失败的http.get请求。错误在after挂钩中报告为错误,因为当http.get失败时,Mocha处于执行顺序中。

  3. 您未能在done挂钩中致电after

  4. 您的describe('/'区块应该像这样构建,而不是您目前拥有的区域:

    describe('/', function() {
    
      before(function(done) {
        Code.server.listen(3000, done);
      });
    
      after(function(done) {
        // Make sure to call the done callback after the server is closed.
        Code.server.close(done);
      });
    
      describe("http request", function() {
        it('buy the item', function(done) {
    
          http.get("http://localhost:3000", function(res) {
            // Perform your tests here.
    
            // You must have your done call **inside** the callback to
            // http.get.
            done();
          });
        });
      });
    });
    

    您可以在其中添加ithttp.get次请求,以涵盖您要覆盖的所有案例。