Node.js 和 WebSockets (Socket.io) 单元测试

2024-04-05

有人可以使用 WebSockets (Socket.io) 为 Node.js 提供坚如磐石、极其简单的单元测试吗?

我在 Node.js 中使用 socket.io,并在测试中查看了 socket.io-client 来建立与服务器的客户端连接。然而,我似乎错过了一些东西。

在下面的示例中,“worked...”永远不会被打印出来。

var io = require('socket.io-client')
, assert = require('assert')
, expect = require('expect.js');

describe('Suite of unit tests', function() {

    describe('First (hopefully useful) test', function() {

        var socket = io.connect('http://localhost:3001');
        socket.on('connect', function(done) {
            console.log('worked...');
            done();
        });

        it('Doing some things with indexOf()', function() {
            expect([1, 2, 3].indexOf(5)).to.be.equal(-1);
            expect([1, 2, 3].indexOf(0)).to.be.equal(-1);
        });

    });
});

相反,我只是得到:

  Suite of unit tests
    First (hopefully useful) test
      ✓ Doing some things with indexOf() 


  1 test complete (26 ms)

有什么建议么?


经过进一步的探索和刺激,我发现了一些非常有用的信息 http://blog.foundry376.com/2012/09/connecting-to-a-socket-io-server-from-node-js-unit-tests。在作者的例子中,他指出了建立socket监听器的关键步骤before hooks.

这个例子有效:

假设服务器正在侦听套接字连接localhost:3001, 当然

var io = require('socket.io-client')
, assert = require('assert')
, expect = require('expect.js');

describe('Suite of unit tests', function() {

    var socket;

    beforeEach(function(done) {
        // Setup
        socket = io.connect('http://localhost:3001', {
            'reconnection delay' : 0
            , 'reopen delay' : 0
            , 'force new connection' : true
        });
        socket.on('connect', function() {
            console.log('worked...');
            done();
        });
        socket.on('disconnect', function() {
            console.log('disconnected...');
        })
    });

    afterEach(function(done) {
        // Cleanup
        if(socket.connected) {
            console.log('disconnecting...');
            socket.disconnect();
        } else {
            // There will not be a connection unless you have done() in beforeEach, socket.on('connect'...)
            console.log('no connection to break...');
        }
        done();
    });

    describe('First (hopefully useful) test', function() {

        it('Doing some things with indexOf()', function(done) {
            expect([1, 2, 3].indexOf(5)).to.be.equal(-1);
            expect([1, 2, 3].indexOf(0)).to.be.equal(-1);
            done();
        });

        it('Doing something else with indexOf()', function(done) {
            expect([1, 2, 3].indexOf(5)).to.be.equal(-1);
            expect([1, 2, 3].indexOf(0)).to.be.equal(-1);
            done();
        });

    });

});

我发现放置done() in the beforeEach, socket.on('connect'...)侦听器对于建立连接至关重要。例如,如果您注释掉done()在侦听器中,然后将其添加到一个范围之外(就在退出之前beforeEach),你会看到“没有连接可以断开……”消息而不是“断开连接……”信息。就像这样:

beforeEach(function(done) {
    // Setup
    socket = io.connect('http://localhost:3001', {
        'reconnection delay' : 0
        , 'reopen delay' : 0
        , 'force new connection' : true
    });
    socket.on('connect', function() {
        console.log('worked...');
        //done();
    });
    socket.on('disconnect', function() {
        console.log('disconnected...');
    });
    done();
});

我是摩卡新手,所以可能有一个非常明显的原因来发起放置done()在套接字范围本身内。希望这个小细节能让其他跟我一样的人免于被拉扯。

对我来说,上述测试(具有正确的范围done())输出:

  Suite of unit tests
    First (hopefully useful) test
      ◦ Doing some things with indexOf(): worked...
      ✓ Doing some things with indexOf() 
disconnecting...
disconnected...
      ◦ Doing something else with indexOf(): worked...
      ✓ Doing something else with indexOf() 
disconnecting...
disconnected...


  2 tests complete (93 ms)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Node.js 和 WebSockets (Socket.io) 单元测试 的相关文章

随机推荐

  • 域对象和值对象 - 它们相等吗?

    通过查看 Zend 快速入门教程中的域对象示例以及考虑 DAO VO 模式的其他示例 它们似乎非常相似 我们能否推断出 值对象 与 域对象 是一样的 如果不是 您能澄清一下它们之间的区别吗 其中一个的功能是什么 如果另一个的功能又如何呢 我
  • 如何使用 SlowCheetah 转换 Json 配置文件中的数组元素?

    这是我第一次使用 SlowCheetah 作为 JSON 配置文件 我找不到让它转换数组设置的方法 例如 如果我的基本配置文件具有以下设置 Settings 1 2 3 我想将其转移到 Settings 4 5 6 它只是进行合并 而不是替
  • 二叉树的列表实现是否可扩展?

    我正在写一个简单的编解码器 该树将被预先计算 一旦构建就不会发生任何变化 它只会被搜索 平衡二叉树的所有叶节点都是信号值 内部节点是近似压缩表示 如果我有很大的叶节点值 使用 stl 矢量的列表实现是否可扩展 目前我不知道有多大 列出实现
  • Typescript 为具有动态和静态键的对象创建接口

    我正在尝试学习打字稿 但在界面方面遇到了障碍 我有一个想要保存的对象token和一个route如下 const obj token thisismytoken path to somewhere 我在这里遇到的问题是 如何生成该对象的接口
  • 使用 Retrofit 网络请求时如何使用 IdlingResource 测试 Android UI

    我正在编写集成测试 在 UI 中执行操作 使用以下命令启动网络调用Retrofit 我知道我需要实施CountingIdlingResource https code google com p android test kit source
  • 通过从 pandas 数据框中的所有行中获取非 NaN 来合并相同索引的行

    我有一个带有重复索引的稀疏数据框 如何以我保留的方式合并相同索引的行所有非 NaN 数据来自冲突的行 我知道您可以使用内置功能实现非常接近的目标drop duplicates功能 但你只能保留first or the last具有相同索引的
  • 如何将ajax html响应附加到当前div的旁边

    I ve DOM如下 div ul li span a Mike a span li li span a John a span li li span a Ket a span li ul div and jQuery如下 document
  • 以编程方式创建物理约束区域,SpriteKit

    我想要两个区域 如下图所示 其中黄色区域包含精灵 例如 我想让黄色区域中的球在黄色区域的边界上弹跳和反射 如何在不使用 sks 文件的情况下以编程方式执行此操作 您可以使用以下命令创建基于边缘的物理体 bodyWithEdgeLoopF r
  • 为我的进程禁用 Windows 错误报告 (Dr. Watson)

    我有一个应用程序托管一些不稳定的第三方代码 我无法在外部进程中控制这些代码 以保护我的主应用程序免受其出现的严重错误的影响 我的父进程正在监视其他进程 并在失败时执行 正确的事情 tm 我遇到的问题是 Dr Watson 仍在检测隔离进程中
  • NativeScript:格式化数字打字稿

    我对 NativeScript 完全陌生 在谷歌上搜索一些基本的东西比应有的更难 我想做的基本上是这样的 我有号码 1234567 89 在变量中 我想将其显示在具有以下格式的标签中 1 234 567 89 另外 如果 89 为 0 则始
  • 获取 Eclipse 编辑器的当前源代码?

    我正在使用 Eclipse IDE 我想首先开发一个插件 这个插件允许我以简单的字符串形式获取整个源代码 我使用模板 hello world command 制作了一个简单的 hello the world 插件 现在我正在寻找从 Ecli
  • 为什么 UIMenuItem 操作的发送者总是 nil?

    我添加了一个UIMenuItem实例到UIMenuController 当我在文本字段中点击两次时 我会看到带有复制 剪切 粘贴 维基百科查找的文本编辑菜单 这是我的操作方法 void lookupInWikipedia id sender
  • 为什么 TFS 2017 Sonar Build Definition 给出“未指定有效规则”错误?

    我有一个为 HTML TypeScript Javascript 创建的 TFS 2017 构建定义 它执行声纳任务 在执行声纳构建定义后 我得到错误 未指定有效规则我的构建摘要中显示的消息 此错误是在构建定义中的运行代码分析任务期间创建的
  • 使用 Java 中的 Office 365 REST API 构建守护程序或服务应用程序

    我正在尝试构建批处理作业来访问 Office 365 Mail API 正在检查文档 https azure microsoft com en us documentation articles active directory authe
  • Spring Boot - @PreAuthorize 在测试中不起作用

    我有这样的控制器 RestController RequestMapping value test PreAuthorize hasRole ADMIN public class TestController RequestMapping
  • 是否可以选择严格传播对象?

    我想知道是否有编译器选项或类似的东西可以使传播对象严格 请参阅以下示例以了解我的意思 interface Foo a string interface Bar a string b number const barObject Bar a
  • 如何在 SwiftUI 中删除列表分隔线

    所以问题很简单 就在标题中 我想删除 SwiftUI iOS 14 中的行分隔符 以前 我使用的是 UITableView appearance separatorStyle none以前在 iOS 13 中可以完成这项工作 但是现在它不起
  • 递归忽略特定目录中除 .json 文件之外的所有文件

    我有一个类似于下面的文件结构 foo bar foo node modules foo bar json node modules foo bar foo bar 我想要做的是忽略里面的所有文件node modules文件夹除了json文件
  • 如何将不同记录的数据添加到一条记录中?

    如果没有时间请看一下示例 我有两种类型的用户 临时用户和永久用户 临时用户以访客身份使用系统 只需提供他们的姓名并使用它 但系统需要跟踪他们 永久用户是指已注册且永久的用户 一旦用户为自己创建永久记录 我需要将用户作为访客时跟踪的所有信息复
  • Node.js 和 WebSockets (Socket.io) 单元测试

    有人可以使用 WebSockets Socket io 为 Node js 提供坚如磐石 极其简单的单元测试吗 我在 Node js 中使用 socket io 并在测试中查看了 socket io client 来建立与服务器的客户端连接