我有一个应用程序,该应用程序在服务器端的数据更新时会动态更新客户端数据。我将AngularJS用作前端,而NODJs作为继电器服务器。因此,当有数据更新发生时,其他人的另一个应用程序将将数据发布到我的Nodejs服务器,该数据将由Nodejs Route API(例如:route.post(/send((处理。出于测试目的,我使用REST客户端将数据发送到此API,并且所有这些都可以正常工作。
当我进行单元测试此路线(/发送(时,我应该确认当我将有效数据发布到节点路由右侧时是否会发生事件发射到前端?我正在使用摩卡柴柴来进行单位测试目的。我可以使用chai.request((方法将邮政请求发送到上述API。但是我如何验证API是否将数据发射到客户端?。。
面临的问题是:此代码正在起作用,这是事件被称为成功的证明。
`server.on('gotData',function(){
console.log('event emitted');
assert(true);
done();
});`
节点代码:
router.post('/send', jsonParser, function (req, res) {
//some logic here
io.to(socketId).emit('gotData', data);
});
客户端
var socket = io.connect(serverUrl);
socket.on('gotData', function(data){
console.log('Data got in client side');
});
测试套件:
it('should be sent event to client-side when valid object has provided', function (done) {
chai.request(server)
.post('/send')
.set({'Content-Type':'application/json'})
.send(data);
var socket;
socket = io.connect(server);
socket.on('gotData',function(){
console.log('event emitted'); // not get firing after chai request
assert(true);
done();
});
});
我不太确定您在问什么,但是如果他们忽略事件管道和路由器管道并专注于测试的逻辑,您的测试会变得更加专注。如果您审核router
和io
框架,并且都有测试以合理地验证事件排放的工作,那么您可以隔离您的特定逻辑,而只能练习它:
router.post('/send', jsonParser, function (req, res) {
//some logic here
io.to(socketId).emit('gotData', data);
});
可能成为:
function yourSendHandler(req, res, ioModule) {
// allow for user passed in ioModule, if not present use global
var io = ioModule || io;
//some logic here
io.to(socketId).emit('gotData', data);
}
router.post('/send', jsonParser, yourSendHandler);
现在,如果导出处理程序,您的测试可以直接导入和练习yourSendHandler
,而不必担心事件,则可以在单位测试中提供模拟io
并断言其呼叫。
在router
夫妻中匿名定义您的功能与router
紧密相关,不允许轻松隔离或测试。