angular - socket javascript



Unit Testing socket.io dans Angular (1)

Votre deuxième approche est la bonne car le faux serveur est un vrai, par conséquent vous devez augmenter le délai d'attente en définissant

jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000; (la valeur doit être ajustée)

n'importe où dans la fonction de description.

Ici vous pouvez trouver un exemple complet.

J'essaie de tester un service angulaire dans mon application, ce qui crée un client socket.io. Mon service ressemble à ceci:

export class SocketService {
  private name: string;
  private host: string = window.location.protocol + "//" + window.location.hostname + ":3000";
  socket: io.Socket;

  constructor() { }

  subscribeEvent(name: string): Observable<IJobResp> {
    this.setup(name);
    return new Observable(observer => {
      this.socket.on('job', val => observer.next(val))
    })
  }

  private setup(name: string) {
    this.name = name;
    let socketUrl = this.host + "/" + this.name;
    this.socket = io.connect(socketUrl);
  }
}

Donc, pour écrire mon test, j'utilise la bibliothèque Mock-socket pour configurer un serveur socket.io mock. Voici à quoi ressemble le test:

describe('SocketService', () => {
  let socket;

  const mockServer = new Server('http://localhost:3000/');
  mockServer.on('connection', server => {
    mockServer.emit('job', 'test message 1');
  });

  (window as any).io = SocketIO;
  beforeEach(() => {
    TestBed.configureTestingModule({
      providers: [JobService]
    });
  });

  it('should xyz, inject([JobService], fakeAsync((service: JobService) => {
    service.subscribeEvent('/').subscribe(val => {
      expect(val).toEqual('test message 1');
    })
  })));
});

Cependant, ce test renvoie l'erreur:

Erreur: Impossible de faire des XHR depuis un faux test asynchrone.

Si je n'ai pas le fakeAsync , alors le test passe avant que l'assertion dans subscribe() soit traitée.

Comment puis-je contourner cela?

Mettre à jour:

Une autre approche que j'ai essayée est d'utiliser async par exemple

  it('should subscribe to dwnTime events', async(inject([JobService], (service: JobService) => {
    service.subscribeEvent('line/602').subscribe(val => {
      expect(val).toEqual('test 2');
    })
  })));

Ensuite, je reçois:

Erreur: Timeout - Le rappel asynchrone n'a pas été appelé dans le délai spécifié par jasmine.DEFAULT_TIMEOUT_INTERVAL.

Cela ressemble à un problème de synchronisation, mais je ne sais toujours pas pourquoi?





jasmine