我需要测试基于websocket的扑克游戏服务器。
因此,如果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
因此
message
的block4
是message1
而不是message2
我怎么解决这个问题?
最佳答案
简单的答案就是在playerX.send(messageX);
之后移动所有playerX.once()
,仅此而已。
切记,这些调用是ASYNC,因此顺序并不重要,但是在您触发某些操作之前,您需要准备好接收。
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));
}