NodeJS Mocha Chai - Chai请求节点事件后的单元测试套接字发出

时间:2017-06-07 14:10:16

标签: node.js unit-testing mocha chai

我有一个应用程序,只要服务器端有数据更新,它就会动态更新客户端数据。我使用AngularJS作为前端,NodJS作为中继服务器。因此,当有数据更新发生时,其他人的另一个应用程序会将数据发布到我的NodeJS服务器,这将由NodeJS路由API处理(例如:route.post(/ send))。出于测试目的,我使用REST CLIENT将数据发送到此API,这些都可以正常工作。

当我对这条路线(/ send)进行单元测试时,我应该确认当我将有效数据发送到节点路径时是否有事件发生在前端?我正在使用摩卡柴进行单元测试。我可以使用chai.request()方法将post请求发送到上述API。但是我如何验证API是否将数据发送到客户端?.Below是我的示例代码,我认为它是不言自明的。

面临的问题是:这段代码正在运行,这证明了被调用事件的成功。

 `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();
   });
});

1 个答案:

答案 0 :(得分:0)

我不确定你在问什么,但是如果他们忽略事件管道和路由器管道并且专注于你的测试逻辑,你的测试会变得更加集中。如果您审核了routerio框架并且两者都进行了测试以合理地验证事件排放是否有效,那么您可以隔离您的特定逻辑并仅执行它:

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紧密联系起来,并且不允许轻松隔离或测试。