测试socket.on('data')回调,而不会让摩卡超时
Testing a socket.on('data') callback without having mocha time out
试图在节点中围绕TCP服务器并在摩卡中进行测试!
这是我到目前为止所做的:
在 tcp 服务器中.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');
});
在测试中.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((( 行触发了,但控制台.log没有更新。日志似乎仅在摩卡超时时才更新(即没有 done(( 调用(。
有什么想法,我如何确保在"data"事件之后应该执行的所有内容都执行,以便我可以检查日志是否已更新?
谢谢!
编辑:问题不在于测试,而在于TCP服务器(我没有正确关闭它(。
在 tcp 服务器中.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");
});
并在测试中.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()
执行一次,done()
server.listen()
回调。这将确保服务器在执行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();
});
});
});
相关文章:
- 摩卡由于绝对路径而不断轰炸
- 如何使用浏览器中用酶创建的组件反应例如摩卡
- 找不到模块'它'当用摩卡/柴测试时
- 摩卡+柴+jsdom Can't加载自定义模块目录
- 如何将 XML 文件包含在摩卡测试用例中
- 摩卡与敏捷(异步)冲突
- 用于摩卡测试的 CLI 调试器
- 如何在摩卡测试中使用“定义”
- 摩卡“每个钩子之前”红色消息.我怎么知道具体出了什么问题
- 错误:使用摩卡测试时找不到模块
- 大口喝摩卡如何传递编译器标志
- 使用带量角器的摩卡无法通过超时测试
- 摩卡测试在Saucelabs上超时
- 摩卡和猫鼬超时
- 测试socket.on('data')回调,而不会让摩卡超时
- 摩卡,超过2000ms的超时时间.确保在这个测试中调用了done()回调
- 摩卡测试超时了
- 在摩卡失败的“断言”中;In assert函数导致超时而不是失败
- 用摩卡测试时超时
- 2000毫秒的超时超过了摩卡