【问题标题】:stubbing a socket client with sinon使用 sinon 存根套接字客户端
【发布时间】:2016-05-04 13:13:26
【问题描述】:

我正在尝试对 socketcluster-client 进行存根以向 socketserver 发出事件。

我不断收到来自 sinon 的以下错误

 TypeError: socket.emit is not a function

这是我的测试套件

import {expect} from 'chai';
import sinon from 'sinon'
import io from 'socketcluster-client';
import testServer from '../../server/server.js';

describe('httpServer',() => {


  beforeEach(() => {
    testServer(4000)
  })

  it('should respond to the ping event',() => {
    var socket =sinon.stub(io,'connect')

    var message = 'house'
    socket.emit('ping',message);
  })

})

通常需要使用指定端口的参数调用连接函数 io.connect({port:4000})

如何用 sinon 存根?

理想情况下,我希望从存根发出事件来检查我的服务器响应

【问题讨论】:

    标签: websocket socket.io mocha.js sinon socketcluster


    【解决方案1】:

    您想使用sinon.spy(),而不是sinon.stub()。前者会调用原函数,后者不会。

    引用the documentation:

    使用存根包装现有函数时,不会调用原始函数。

    您还需要确保您也确实调用了它,而您当前的代码似乎没有这样做。

    编辑:在您的 cmets 看来,您要做的就是运行一个客户端,向服务器发送一些消息,然后检查服务器是否正确响应。你不需要间谍/存根。

    我不知道socketcluster,但是为了说明如何实现它,这里有一个使用简单 HTTP 服务器的示例:

    describe('httpServer', () => {
    
      before((done) => {
        http.createServer((req, res) => {
          res.end(req.url === '/ping' ? 'PONG' : 'HELLO WORLD');
        }).listen(4000, done);
      });
    
      it('should respond to the ping event', (done) => {
    
        http.get('http://localhost:4000/ping', (res) => {
          let buffers = [];
    
          res.on('data', (d) => buffers.push(d))
             .on('end', () => {
               let body = Buffer.concat(buffers);
               expect(body.toString()).to.equal('PONG');
               done();
             });
        });
    
      });
    });
    

    (这是一个最小的示例,因为它不会在测试完成后检查错误或清理 HTTP 服务器)

    【讨论】:

    • 这样的? pastebin.com/iym6Fe2v - 我不确定我是否真的以正确的方式处理 tdd。这是通过存根/监视套接字客户端来测试套接字服务器的正确方法吗?
    • 让我们从头开始:你到底想测试什么? :-D 间谍/存根旨在“挂钩”现有函数/方法,以查看它们是否被特定参数调用,或者这些函数/方法的调用者是否正确响应某些条件。
    • 我想从客户端发出一个 'ping' 事件并检查服务器是否正确响应了 'ping' 事件(返回 'pong',或者根据负载返回错误)。我想使用 stub/spy 的原因是只测试服务器响应而不是客户端。
    • @Kunkka 我添加了一些可能有用的额外示例代码。
    • 如果我不使用 sinon/stub 来模拟客户端?这不被认为是集成测试吗?如果是这样,我需要做单元测试吗?我试过这样做 - gist.github.com/Kannaj/8a49fd36f9c9877128eaec9d5330f39e
    猜你喜欢
    • 2018-06-10
    • 2020-05-27
    • 1970-01-01
    • 2014-04-18
    • 2013-10-23
    • 1970-01-01
    • 1970-01-01
    • 2013-04-17
    • 2015-02-08
    相关资源
    最近更新 更多