2 votes

Test pour le délai d'attente dans mocha

J'ai un serveur Faye publish/subscribe qui envoie un message aux nouveaux abonnés uniquement si un message a déjà été envoyé aux autres abonnés. J'utilise mocha pour les tests unitaires.

Ce test permet de confirmer la fonctionnalité de base :

    it('should send a special message to new subscribers', function(done){
        testerPubSub.setLastJsonContent('some arbitrary content');
        var subscription = client.subscribe("/info", function(message) {
            assert.equal(true, message.text.indexOf('some arbitrary content') !== -1, 'new subscriber message not sent');
            done();
        });
        subscription.cancel();
    });

Mais je voudrais maintenant tester le cas où il n'y a pas eu de message envoyé aux abonnés précédents. Ce test serait quelque chose comme :

    it('should not send a special message to new subscribers if no data has been retrieved', function(done){
        testerPubSub.setLastJsonContent(null);
        var messageReceived = false;
        var subscription = client.subscribe("/sales", function(message) {
            messageReceived = true;
        });

        ////need to magically wait 2 seconds here for the subscription callback to timeout

        assert.equal(false, messageRecieved, 'new subscriber message received');
        subscription.cancel;
        done();
    });

Bien sûr, la fonction de sommeil magique est problématique. Existe-t-il une meilleure façon de réaliser ce genre de test "Je m'attends à ce que le callback ne soit jamais activé" ?

Merci, Mike

0voto

Mike Hedman Points 546

J'ai pensé à une solution possible, mais elle est un peu trop dépendante du timing pour que je la considère comme LA solution :

    it('should not send a special message to new subscribers if no data has been retrieved', function(done){
        testerPubSub.setLastJsonContent(null);
        var messageReceived = false;
        var subscription = client.subscribe("/sales", function(message) {
            assert.fail(message.text, '', 'Should not get message', '=');
        });
        setTimeout(function(){
            done();
        }, 1500);

        subscription.cancel;
    });

Ce test est réussi, mais la pause de 1500 ms semble plutôt arbitraire. Je suis en train de dire "juste avant de penser qu'il va y avoir un dépassement de délai, interviens et dis que c'est bon".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X