如何对Web套接字进行单元测试 - JavaScript

JS-*_*JS- 9 javascript unit-testing websocket

我想测试使用sockjs实现的Web套接字.

   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');
   };
Run Code Online (Sandbox Code Playgroud)

我g目结舌,只发现了这篇文章.这不够好,因为它正在进行实际连接而不是假装.

我也尝试过,但这里只找到了一个悬而未决的问题.

有人提出了sinonjs,但我找不到任何体面的例子.

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

Phi*_*ipp 4

当您想要对访问外部资源的功能(例如您的 websocket 服务器)进行单元测试时,通常的方法是使用模拟对象来表示外部资源。模拟对象是一种外观和行为类似于外部资源的对象,但实际上并不访问它。此外,它还可以具有日志记录功能,如果测试的代码的行为符合预期,则可以向测试代码报告。

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

然后,您将重构要测试的代码,以便它本身不会创建套接字,而是获取从外部分配的套接字对象(这称为“依赖项注入”,是编写可单元测试代码的关键习惯用法) 。

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

  • @user2855314 Jasmin 将模拟对象实现为实际对象周围的装饰器。它的术语是“间谍”。“SpyOn”方法可以与对“andCallFake(function)”的调用链接起来,后者将方法调用委托给您自己的实现。这可以防止对象实际尝试联系服务器,而是返回您的实现所返回的内容。 (3认同)
  • 感谢您的反馈,看起来工作量很大。我正在寻找现成的东西。例如,jasmine 拥有创建虚假 AJAX 调用的所有工具。Web 套接字变得越来越流行。有没有任何库可以为我提供这些开箱即用的模拟对象? (2认同)
  • @Philipp,你能提供任何例子吗? (2认同)