1

J'ai lu ce docs "en marbre", mais je ne comprends pas.Comment tester unitairement rxjs5?

Ce que je veux tester est fondamentalement un "protocole". J'ai une "chose" qui est connectée à un observable et qui émet des données. Dans mon code back-end avec Rx.NET et C# J'ai écrit une aide pour tester des protocoles afin que mes tests ressemblent à ceci:

verifier.Send(new AddMaterialPickCommand(commandId, orderId, materialId: Guid.NewGuid(), quantity: 1)) 
      .FailWhen<CommandFailedEvent>(e => e.CommandId == commandId) 
      .ThenExpect<MaterialPickAddedEvent>(e => e.EntityId == orderId) 
      .ThenSend(new DeleteOrderCommand(commandId, orderId)) 
      .FailWhen<CommandFailedEvent>(e => e.CommandId == commandId) 
      .ThenExpect<OrderDeletedEvent>(e => e.EntityId == orderId) 
      .ExecuteAndWait(Timeout); 

en C# est très facile de se connecter observables à toutes choses et son très facile à attendez. IMO c'est un code de test très lisible.

Avec Rxjs5, je n'ai trouvé aucune possibilité d'attendre ou de faire quelque chose de similaire. Alors atm je ne en train de vérifier qu'une seule chose émise par mon observable est celui attendu:

sut.setValue("key1", "key2"); 
sut.getObservable("key1", "key2") 
    .subscribe(value => { 
     expect(value).toBe("testValue") // I want either execute this or fail after a timeout 
    }); 

setValue appelle en fait next() sur un BehaviourSubject.

Je suis désemparée, des idées?

Répondre

0

Il y a plusieurs façons de le faire, d'une manière est avec un délai d'attente comme démontré dans cet exemple (working example):

// Generates a value every second starting one second after subscription 
const eventEmulatorStream = Rx.Observable.interval(1000); 

// Listen to the event stream and timeout after 500 ms. 
// On timeout an error will be generated that will be caught in the 
// 'error' part of the subscribe. 
eventEmulatorStream 
    .timeout(500) 
    .subscribe({ 
     next: value => console.log(value), 
     error: err => console.log(JSON.stringify(err)) 
    }); 

Je vous suggère de jeter un oeil à la RxJS reference, il y a des butins de goodies là-bas. Selon comment et où vous utilisez RxJS, vous devrez peut-être importer/charger certaines choses pour avoir accès à certaines fonctionnalités, mais cela doit être expliqué clairement dans la documentation de RxJS.