0

socketcluster-client をスタブして、socketserver にイベントを発行しようとしています。

シノンから以下のエラーが発生し続けます

 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}) を指定する引数で呼び出す必要があります。

これをシノンでスタブするにはどうすればよいですか?

サーバーの応答を確認するためにスタブからイベントを発行したい

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 に答える