javascript - 在没有摩卡超时的情况下测试 socket.on ('data' ) 回调

标签 javascript node.js sockets tcp

尝试了解 Node 中的 TCP 服务器并在 Mocha 中进行测试!

这是我到目前为止所做的事情:

在 tcp-server.js 中

'use strict';
var net = require('net');
var fs = require('fs');

var server = module.exports.server = net.createServer(function(socket){
  socket.on('data', function(data){
    console.log(data.toString());
    var requestString = "Requested on: " + new Date().toString() + "\n" + data.toString();
    var writeStream = fs.createWriteStream("datalog.log", {'flags': 'a'});
    writeStream.write(requestString);
    writeStream.end();
  });

  socket.on('end', function(){
    console.log('socket closed');
  });
});

server.listen('3000', function(){
  console.log('server up');
});

在 test.js 中:

var fs = require('fs');
var net = require('net');
var expect = require('chai').expect;
var server = require(__dirname + "/../tcp-server.js").server;
var request = require('superagent');

describe('the tcp server', function() {

  beforeEach(function(){
    server.listen('3000', function(){
      console.log('server up in mocha!');
    });
  });

  it('should log all requests to a log file', function(done){
  request.get('http://localhost:3000').end(function(err, res){
    expect(true).to.equal(false); //This test doesn't run
    //eventually write some fs code that tests if the log file is written to;
      done();
    });
  });
});

看起来 tcp-server.js 中的 console.log(data.toString()) 行被触发,但 console.log 没有更新。日志似乎仅在 mocha 超时时更新(即没有 did() 调用)。

有什么想法可以确保“数据”事件之后应该执行的所有内容都执行,以便我可以检查日志是否已更新?

谢谢!

编辑:问题不在于测试,而在于 TCP 服务器(我没有正确关闭它)。

在 tcp-server.js 中

'use strict';
var net = require('net');
var fs = require('fs');

var server = module.exports.server = net.createServer(function(socket){
  socket.on('data', function(data){
    var requestString = data.toString();
    var writeStream = fs.createWriteStream("datalog.log", {'flags': 'a'});
    writeStream.write(requestString);
    writeStream.end();
    socket.end();
  });

  socket.on('end', function(){
    console.log('socket closed');
    server.close();
  });
});

server.listen('3000', function(){
  console.log('server up');
});

var client = net.connect({port: 3000},
    function() { //'connect' listener
  console.log('connected to server!');
  client.write("Requested on: " + new Date().toString() + "\n");
});

在 test.js 中

var fs = require('fs');
var net = require('net');
var expect = require('chai').expect;
var server = require(__dirname + "/../tcp-server.js").server;

describe('the tcp server', function() {
  var logstringBefore = "";
  var logstringAfter = "";

  before(function(done){
    fs.readFile('datalog.log', function(err, data){
      logstringBefore = data.toString();
      done();
    });
  });

  it('should log all requests to a log file and change it', function(done){
    server.listen('3000', function(){
    var requestString = "Requested on: " + new Date().toString();
      console.log('server up in mocha!');
      fs.readFile('datalog.log', function(err, data){
        logstringAfter = data.toString();
        expect(logstringAfter).to.include(requestString);
        expect(logstringBefore).to.not.equal(logstringAfter);
        done();
       });
    });
  });
});

最佳答案

done() 应在 end() 完成执行后调用,即当触发回调时,如下所示。

还要考虑重构代码,如下所示。 server.listen() 移至 before(),因此对于 describe( 内的所有 it() 只执行一次) 并在 server.listen() 中回调 done()。这将确保服务器在 it() 执行之前准备就绪。

describe('the tcp server', function() {

  before(function(done){
    server.listen('3000', function(){
      console.log('server up in mocha!');
      done();
    });
  });

  beforeEach(function(){});

  it('should log all requests to a log file', function(done){
    request.get('http://localhost:3000').end(function(err, res){
      expect(true).to.equal(false);
      done();
    });
  });
});

关于javascript - 在没有摩卡超时的情况下测试 socket.on ('data' ) 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33491258/

相关文章:

javascript - Node.js 域集群工作器断开连接

node.js - 如何从 Sequelize 的输出中删除关联?

ios - Firebase Messaging shouldEstablishDirectChannel 未在首次应用启动时建立连接

c# - 单客户端 TCP 服务器模型

javascript - 在水平滚动上更改 li 类

javascript - AJAX 请求后链接不起作用

javascript - 如何将内部回调的结果传递到其父函数中?

c++ - 为异步发送缓冲区保留内存( boost asio 套接字)

javascript - D3垂直条形图为标签文本添加换行符

javascript - HTML5 Required 字段错误信息问题