2013-10-09 2 views
9

Я хотел бы протестировать веб-сокеты, которые были реализованы с использованием sockjs.Как установить тестовые сетевые сокеты - JavaScript

var sock = new SockJS('http://mydomain.com/my_prefix'); 
    sock.onopen = function() { 
     console.log('open'); 
    }; 
    sock.onmessage = function(e) { 
     console.log('message', e.data); 
    }; 
    sock.onclose = function() { 
     console.log('close'); 
    }; 

Я изучил и нашел только article. Это не очень хорошо, потому что это делает фактическое соединение, а не притворяется.

Я также пробовал SO, но нашел только неотвеченный вопрос here.

Кто-то предложил синони, но я не могу найти достойного примера.

Буду признателен, если кто-то может пролить свет на эту тему.

ответ

3

Если вы хотите подвергнуть тестированию функцию, которая обращается к внешнему ресурсу, например, в вашем случае серверу веб-сеток, обычный подход заключается в использовании макет-объекта для представления внешнего ресурса. Макет-объект - это объект, который выглядит и ведет себя как внешний ресурс, но фактически не обращается к нему. Кроме того, он может иметь функцию ведения журнала, которая позволяет ему сообщать тестовому коду, если проверенный код ведет себя так, как ожидалось.

В вашем случае вы создадите объект mock-SockJS, который обладает всеми соответствующими свойствами и методами обычного объекта SockJS, но его реализация фактически не связывается с сервером. Он только регистрирует вызовы метода и возвращает ожидаемый ответ, который будет отправлять существующий сервер.

Затем вы будете реорганизовывать код, который хотите протестировать, чтобы он не создавал сам сокет, а вместо этого получает объект сокета, назначенный снаружи (это называется «dependency injection» и является решающим идиомом для записи единиц измерения, проверяемый код).

В вашем реальном коде вы назначаете реальный объект SockJS. Но в вашем модульном тесте вы назначаете свой макет-объект. После того, как вы вызвали свои тестовые методы, вы можете проверить макет-объект, чтобы проверить, отправил ли устройство ожидаемые данные на сервер.

+2

Благодарим вас за отзыв, это похоже на много работы. Я ищу что-то готовое. Например, у жасмина есть все инструменты для создания фальшивых вызовов AJAX. Веб-сокеты становятся все более популярными. Есть ли какая-нибудь библиотека, которая дает мне эти макетные предметы из коробки? –

+2

@ user2855314 Jasmin реализует макет объектов в качестве декораторов вокруг реальных объектов. Его терминология для этого - «Шпион». Метод «SpyOn» может быть связан цепью с вызовом 'andCallFake (function)', который делегирует вызов метода для вашей собственной реализации. Это предотвращает попытку объекта фактически связаться с сервером и вместо этого возвращает то, что возвращает ваша реализация. – Philipp

+1

@Philipp, можете ли вы представить какой-либо пример для этого? –

Смежные вопросы