如何使用mocha测试node.js websocket服务器?
我需要测试一个基于websocket的扑克游戏服务器 所以,若如何使用mocha测试node.js websocket服务器?,node.js,unit-testing,websocket,socket.io,mocha.js,Node.js,Unit Testing,Websocket,Socket.io,Mocha.js,我需要测试一个基于websocket的扑克游戏服务器 所以,若player1向服务器发送消息,服务器通常应该向其他玩家发送消息 我编写了一个测试块,如下所示: describe('protocol', () => { before(() => { player1 = new WebSocket('ws://xxxxxx'); player1 = new WebSocket('ws://xxxxxx'); player2 = new WebSocket('w
player1
向服务器发送消息,服务器通常应该向其他玩家发送消息
我编写了一个测试块,如下所示:
describe('protocol', () => {
before(() => {
player1 = new WebSocket('ws://xxxxxx');
player1 = new WebSocket('ws://xxxxxx');
player2 = new WebSocket('ws://xxxxxx');
player3 = new WebSocket('ws://xxxxxx');
});
it('player1 send message1 player3 should receive' (done) => {
//block1
let message1 = {
id: 'message1',
data: 'message1'
};
player1.send(JSON.stringify(message1));
player3.once('message', (message) => {
//block2
expect(message).equal(JSON.stringify(message1)),
done();
});
});
it('player2 send message2 player3 should also receive' (done) => {
//block3
let message2 = {
id: 'message2',
data: 'message2'
};
player2.send(JSON.stringify(message1));
player3.once('message', (message) => {
//block4
expect(message).equal(JSON.stringify(message2)),
done();
});
});
}
我想要的执行顺序是:
block1
->block2
->block3
->block4
但是真正的:blocks1
->block3
->block2
->block4
因此block4
的message
是message1
而不是message2
我怎样才能解决这个问题呢?简单的回答就是移动所有的
playerX.send(messageX)
在playerX.once()之后(
),就是这样
请记住,这些调用是异步的,所以顺序并不重要,但您需要在启动某些东西之前做好接收准备
describe('protocol', () => {
before(() => {
player1 = new WebSocket('ws://xxxxxx');
player1 = new WebSocket('ws://xxxxxx');
player2 = new WebSocket('ws://xxxxxx');
player3 = new WebSocket('ws://xxxxxx');
});
it('player1 send message1 player3 should receive', (done) => {
//block1
let message1 = {
id: 'message1',
data: 'message1'
};
player3.once('message', (message) => {
//block2
expect(message).equal(JSON.stringify(message1));
done();
});
player1.send(JSON.stringify(message1));
});
it('player2 send message2 player3 should also receive', (done) => {
//block3
let message2 = {
id: 'message2',
data: 'message2'
};
player3.once('message', (message) => {
//block4
expect(message).equal(JSON.stringify(message2));
done();
});
});
player2.send(JSON.stringify(message1));
}
我认为不管执行顺序如何,单元测试都应该通过。据我所知,在摩卡控制测试的执行顺序是不可行的 与其这样做,不如将服务器每单元测试设置为侦听不同的端口?然后,测试不应该相互干扰
你可以这样做。只需在每次之前设置一个随机分配端口的服务器,然后在每次之后关闭服务器。在我这方面,我使用npm模块mocha步骤,允许顺序测试。它解决了我们项目中的许多测试问题。但它并不有效,
之前
或之后
没有影响。因为playerX.send(messageX)
和playerX。一旦('xxx',listener)
被同步调用,listener总是在这些之后调用。对不起,我错了。我的代码是正确的,问题来自其他地方。对不起!!!!此代码块的执行顺序为block1
->block2
->block3
->block4