2013-10-09 43 views
9

我想测试已使用sockjs实现的网络套接字。如何对网络套接字进行单元测试 - JavaScript

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但我无法找到任何像样的例子。

,我会很感激,如果有人能在这个话题提供一些线索。

回答

3

当你想单元测试一项功能,访问外部资源,就像在你的情况下,WebSocket的服务器,通常的做法是使用模拟对象来表示外部资源。模拟对象是一种外观和行为像外部资源的对象,但实际上并没有访问它。另外,它可以具有日志记录功能,允许它向测试代码报告测试代码的行为是否像预期的那样。

在你的情况,你会创造出拥有所有相关属性和正常SockJS的方法对象一个模拟SockJS对象,但其实施不实际接触的服务器。它只记录方法调用并返回现有服务器发送的预期响应。

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

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

+2

感谢您的反馈,它看起来像很多工作。我正在寻找准备好的东西。例如,茉莉花已经有了创建假AJAX调用的所有工具。 Web套接字正变得越来越流行。是否有任何图书馆能够将这些模拟对象从盒子中拿出来? –

+2

@ user2855314 Jasmin将实体对象作为装饰器实现模拟对象。它的术语是“间谍”。 'SpyOn'方法可以通过调用'andCallFake(function)'来实现,方法调用委托给你自己的实现。这可以防止对象实际尝试联系服务器,而是返回实现返回的内容。 – Philipp

+1

@菲利普,你能提供这方面的例子吗? –