0

我正在尝试存根 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);
  })

})

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

我如何用 sinon 存根?

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

4

1 回答 1

1

你想用sinon.spy(),没有sinon.stub()。前者会调用原始函数,后者不会。

从文档中引用:

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

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

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

我不知道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 服务器)

于 2016-05-04T13:48:31.753 回答