Как я могу создать макет веб-сокетов / веб-узлов с помощью Sinon? Я пытаюсь проверить, что мое приложение ведет себя должным образом при использовании WebSockets, без необходимости каждый раз подключаться (например, при тестировании обработчиков событий и т. д.).
Исходя из опыта работы с C#, я бы просто смоделировал весь интерфейс, используя такую библиотеку, как Moq, а затем убедился, что мое приложение выполнило ожидаемые вызовы.
Однако, пытаясь сделать это с помощью Sinon, я сталкиваюсь с ошибками.
Пример теста:
const WebSocket = require('ws');
const sinon = require('sinon');
const webSocket = sinon.mock(WebSocket);
webSocket.expects('on').withArgs(sinon.match.any, sinon.match.any);
const subject = new MyClass(logger, webSocket);
Затем этот класс вызывает:
this._webSocket.on("open", () => {
this.onWebSocketOpen();
});
Но когда я пытаюсь запустить свои тесты, я получаю такую ошибку:
TypeError: Attempted to wrap undefined property on as function
Как правильно смоделировать такой объект с помощью Sinon?
Спасибо.





Если вы просто пытаетесь проверить, был ли вызван данный метод сокета 'on' при передаче, вы бы сделали это следующим образом:
class MyClass {
constructor(socket) {
this._socket = socket;
this._socket.on('open', () => {
//whatever...
});
};
};
module.exports = MyClass;
const chai = require('chai');
const expect = chai.expect;
const sinon = require('sinon');
const sinon_chai = require('sinon-chai');
const MyClass = require('../index.js');
const sb = sinon.sandbox.create();
chai.use(sinon_chai);
describe('MyClass', () => {
describe('.constructor(socket)', () => {
it('should call the .prototype.on method of the given socket\n \t' +
'passing \'open\' as first param and some function as second param', () => {
var socket = { on: (a,b) => {} };
var stub = sb.stub(socket, 'on').returns('whatever');
var inst = new MyClass(socket);
expect(stub.firstCall.args[0]).to.equal('open');
expect(typeof stub.firstCall.args[1] === 'function').to.equal(true);
});
});
});