【问题标题】:How to unit test web sockets - JavaScript如何对 Web 套接字进行单元测试 - JavaScript
【发布时间】:2013-10-09 10:05:46
【问题描述】:

我想测试使用sockjs 实现的网络套接字。

   var sock = new SockJS('http://mydomain.com/my_prefix');
   sock.onopen = function() {
       console.log('open');
   };
   sock.onmessage = function(e) {
       console.log('message', e.data);
   };
   sock.onclose = function() {
       console.log('close');
   };

我擦了擦,只发现了这个article。这还不够好,因为它正在建立实际连接而不是伪造它。

我也尝试过,但只发现了一个未回答的问题here

有人建议 sinonjs,但我找不到任何像样的例子。

如果有人能对这个话题有所了解,我将不胜感激。

【问题讨论】:

    标签: javascript unit-testing websocket


    【解决方案1】:

    当您想要对访问外部资源的功能进行单元测试时,例如在您的情况下是 websocket 服务器,通常的方法是使用模拟对象来表示外部资源。模拟对象是一个看起来和行为都像外部资源的对象,但实际上并不访问它。此外,它可以具有日志记录功能,如果测试代码的行为符合预期,它可以向测试代码报告。

    在您的情况下,您将创建一个 mock-SockJS 对象,该对象具有普通 SockJS 对象的所有相关属性和方法,但它的实现实际上并不联系服务器。它只记录方法调用并返回现有服务器将发送的预期响应。

    然后你将重构你想要测试的代码,这样它就不会创建套接字本身,而是从外部分配一个套接字对象(这被称为“dependency injection”并且是编写单元的一个关键习语- 可测试的代码)。

    在您的真实代码中,您分配了一个真实的 SockJS 对象。但是在您的单元测试中,您分配了您的模拟对象。调用测试方法后,您可以检查模拟对象以检查单元是否将预期数据发送到服务器。

    【讨论】:

    • 感谢您的反馈,看起来工作量很大。我正在寻找现成的东西。例如,jasmine 拥有创建虚假 AJAX 调用的所有工具。 Web 套接字正变得越来越流行。是否有任何库可以为我提供这些开箱即用的模拟对象?
    • @user2855314 Jasmin 将模拟对象实现为围绕实际对象的装饰器。它的术语是SpySpyOn 方法可以与对 andCallFake(function) 的调用链接起来,它将方法调用委托给您自己的实现。这可以防止对象实际尝试联系服务器,而是返回您的实现返回的内容。
    • @Philipp,你能举个例子吗?
    猜你喜欢
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    • 2017-07-15
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多