在客户端testingJavascript

我写了一个实时的js应用程序,它有以下的堆栈:

  1. Node.js服务器
  2. Socket.io作为通信层
  3. jQuery在前端操纵dom等

对于#1,我绝对没有问题的testing。 我目前正在使用nodeunit,这是一个非常出色的工作。

对于#3,我试图找出我的testing方法有点麻烦。

我的浏览器端代码通常是这样的:

var user = { // Rendered by html id: null, roomId: null, foo: null, // Set by node server. socket: null, clientId: null, ... } $('button#ready').click(function() { socket.emit('READY'); }); socket.on('INIT', function(clientId, userIds, serverName) { user.clientId = clientId; user.foo = (serverName == 'bar') ? 'bar' : 'baz'; }); 

我想要testing的主要部分包括检查浏览器端的js是否会在服务器使用指定的参数激发某个数据包时作出相应的反应:

user.foo =(serverName =='bar')? 'bar':'baz';

任何好的build议如何解决这个问题?

看看摩卡 。 它在节点和浏览器中都有很好的支持。 我发现它更适合于其他select(茉莉花,誓言)。

另外,我不是运行一个像Selenium这样的重量级集成设置,而是使用僵尸进行一个进程中的服务器testing和浏览器testing。 它允许一些漂亮的集成工作stream程(如触发浏览器上的某些内容,然后validation服务器上的效果)。

然而,YMMV作为僵尸是依靠JSDOM(在Javascript中重新实现DOM)。 有修补/固定的粗糙的边缘,东西rest。 如果这是一个问题,使用真正的浏览器(也许通过Selenium利用)在浏览器中运行Mocha。

尽pipePivotal对jasmine的支持有点受挫(最小的新开发,很多未回答的问题/他们的github上的pull请求), Jasmine是testing客户端代码的一个非常好的工具,主要是因为jasmine-jquery 。

茉莉花的一般方法是非常稳固的,Jasmine-Jquery有很多用于testingDOM的很好的匹配器,以及很棒的DOM沙盒。

我在客户端find了一个挑战,主要是因为我不得不在我的testing中变得僵硬和规范。

一般来说,您应该以一种“模糊”的方式来处理客户端testing,特别是testingDOM层次结构是通向地狱之路。 testing的东西,比如“页面是否包含这些单词”,“是否div id#my-div包含一个ul,带有3个li,内容与此正则expression式匹配”

后者是我如何开始做testing,但我发现它非常耗时和脆弱; 如果devise师(我)想要弄乱这个结构,它可能会不必要地破坏许多testing。 解决这个问题的唯一方法就是为每个组件创build“小部件”,这将是理想的,但正如我所说,非常费时,它实际上成了我办公室里的一个笑话:“本周Tim做了多lesstesting? 2?3?哇3testing,好工作。“

无论如何…

通过松散地testing,您可以获得90%的客户端testing的好处,并且专注于重要的内容,例如页面层次结构中特定位置的特定内容的工作stream和数据“存在”。

编辑:此外,确保您将业务逻辑分解为独立于DOM的单元,尽可能多的人为可能。 这会让你的生活变得更轻松,并且通常会导致更好的build筑,这是一个好的方面。

编辑2:你可能想看看如何使用水豚/黄瓜或selenium的Rails世界。