AngularJS – recurso de simulação ngWebsocket

Antes de ler este tópico, você também pode querer ler o anterior: HTML5 Websocket com AngularJS

Este tópico fala sobre o módulo ngWebsocket

Desenvolvendo com ngWebsocket

Trabalhar com HTML5 Websocket precisa ter um back-end de escuta que aceite uma conexão e responda com alguns dados.
Mas e se pudermos desenvolver e testar nosso aplicativo de websocket sem um back-end real?
Quero dizer, com AngularJS você pode usar o serviço $ httpBackend para simular um servidor da web http e isso é realmente útil para teste.
Então, acho que podemos fazer a mesma coisa (não, espere, melhor ainda!) Com o ngWebsocket.

Como? Com um recurso intrigante chamado mock .

Zombar

Mock é uma propriedade que pode ser passada para o construtor ngWebsocket da seguinte maneira:

angular.controller('MyCtrl', function ($websocket) {
var ws = $websocket.$new({
url
: 'ws://localhost:12345',
mock
: true
});
});

Por padrão, mock é definido como false.
No entanto, se você passar um booleano verdadeiro para ele, ele será habilitado e um servidor parrot do websocket será simulado.
Isso significa que cada evento que sua instância ngWebsocket irá emitir será interceptado pelo
servidor interno do websocket e obterá uma resposta no mesmo evento com os mesmos dados. Como um papagaio, certo?

Vamos ver em ação:

angular.controller('MyCtrl', function ($websocket) {
var ws = $websocket.$new({
url
: 'ws://localhost:12345',
mock
: true
});

ws
.$on('$open', function () {
ws
.$emit('a test', 'hello world');
ws
.$emit('another test', {
my
: 'awesome data'
});
});

ws
.$on('a test', function (message) {
console
.log(message); // 'hello world'
});

ws
.$on('another test', function (message) {
console
.log(message.my); // 'awesome data'
});
});

Como você pode ver, isso é muito útil!
Por quê? Porque você pode desenvolver seu aplicativo sem um back-end real.

Portanto, sua equipe de back-end e você podem configurar um protocolo de comunicação (talvez em JSON) que permite compartilhar dados entre
o aplicativo de front-end e o back-end.
Enquanto isso, o desenvolvimento de seu aplicativo pode ser feito em paralelo com o back-end, mesmo que eles não se comuniquem.
Quando o back-end estiver pronto, basta remover a propriedade mock do construtor e seu aplicativo enviará e
receberá dados de e para o servidor. Se o protocolo foi seguido corretamente, você nunca notará nenhuma mudança.

Testando

Tudo o que você disse é ótimo, sério cara, estou falando sério!
Mas e quanto aos testes ?

Bem, cara, você entendeu!
Como podemos fazer um teste de unidade para aproveitar o recurso de simulação ?

Sem problemas!
Vamos pegar o exemplo acima e transformá-lo em um teste de unidade útil!

var $websocket;

describe
('My awesome websocket unit test', function () {
beforeEach
(module('ngWebsocket')); // require the ngWebsocket module
beforeEach
(inject(function (_$websocket_) {
$websocket
= _$websocket_; // inject the $websocket service
}));

describe
('Testing the websocket', function () {
var ws;

beforeEach
(function (done) {
ws
= $websocket.$new({
url
: 'ws://localhost:12345',
mock
: true
});

ws
.$on('$open', function () {
done
(); // enable all tests after the websocket connection is established
});
});

it
('should receive the same data on the same emitted event', function (done) {
expect
(ws.$status()).toEqual(ws.$OPEN);
expect
(ws.$ready()).toBeTruthy();

ws
.$emit('a test', 'hello world');
ws
.$emit('another test', {
my
: 'awesome data'
});

ws
.$on('a test', function (message) {
expect
(message).toEqual('hello world');
});

ws
.$on('another test', function (message) {
expect
(message.my).toEqual('awesome data');

done
(); // it works sequentially because the internal websocket server uses a queue to enqueues messages
});
});

afterEach
(function () {
ws
.$close(); // close the connection
});
});
});

Você pode ver a luz? normalmente disse um grande homem!

Sim! Nós fazemos!
Este é um exemplo de teste de unidade real e realmente funciona, mesmo se não houver uma linha de código de back-end!

Vou mostrar a você como usar fixtures para simular um servidor de websocket personalizado muito em breve, portanto, fique ligado;)