web-dev-qa-db-fra.com

Mocha avant et après chaque test

J'ai essayé de tester mon serveur de test à l'aide de mocha. C'est le code suivant que j'utilise, presque le même que celui trouvé dans un autre article similaire.

beforeEach(function(done) {
    // Setup
    console.log('test before function');
    ws.on('open', function() {
        console.log('worked...');
        done();
    });
    ws.on('close', function() {
        console.log('disconnected...');
    });
});

afterEach(function(done) {
    // Cleanup
    if(readyState) {
        console.log('disconnecting...');
        ws.close();
    } else {
        // There will not be a connection unless you have done() in beforeEach, socket.on('connect'...)
        console.log('no connection to break...');
    }
    done();
});

describe('WebSocket test', function() {
    //assert.equal(response.result, null, 'Successful Authentification');
});

le problème est que lorsque j'exécute ce projet, aucun des fichiers console.log qui devraient être vus n'est visible sur l'invite de commande. Pouvez-vous m'expliquer ce que je fais mal?

13
zamponotyropita

Georgi a raison: vous avez besoin d'un appel it pour spécifier un test, mais vous n'avez pas besoin d'avoir un niveau supérieur describe dans votre fichier si vous ne le souhaitez pas. Vous pouvez remplacer votre single describe par un tas d'appels it:

it("first", function () {
    // Whatever test.
});

it("second", function () {
    // Whatever other test.
});

Cela fonctionne très bien si votre suite de tests est petite et composée d'un seul fichier.

Si votre suite de tests est plus grande ou répartie sur plusieurs fichiers, je voudrais très fortement vous suggérer de mettre votre beforeEach et afterEach avec votre it à l'intérieur du describe, sauf si vous êtes absolument certain que chaque test de la suite nécessite le travail effectué par beforeEach ou afterEach. (J'ai écrit plusieurs suites de tests avec Mocha et je n'ai jamais eu de beforeEach ou afterEach que je devais exécuter pour chaque test.) Quelque chose comme:

describe('WebSocket test', function() {
    beforeEach(function(done) {
        // ...
    });

    afterEach(function(done) {
       // ...
    });

    it('response should be null', function() {
        assert.equal(response.result, null, 'Successful Authentification');
    });
});

Si vous ne placez pas votre beforeEach et afterEach dans describe comme ceci, alors disons que vous avez un fichier pour tester les sockets web et un autre fichier pour tester certaines opérations de base de données. Les tests dans le fichier qui contient les tests de fonctionnement de la base de données auront également vos beforeEach et afterEach exécutés avant et après leur. Placer les beforeEach et afterEach à l'intérieur du describe comme indiqué ci-dessus garantira qu'ils ne sont effectués que pour vos tests de socket Web.

23
Louis

Vous n'avez aucun test dans votre exemple. S'il n'y a aucun test à exécuter, les crochets avant et après ne seront pas appelés. Essayez d'ajouter un test comme:

describe('WebSocket test', function() {
    it('should run test and invoke hooks', function(done) {
        assert.equal(1,1);
        done(); 
    });
});
7
Georgi

Vous devez avoir un test-callback (par exemple it) à l'intérieur de la suite-callback (par exemple, describe) pour exécuter beforeEach() et afterEach() hooks . Plus d'informations https://mochajs.org/#run-cycle-overview

0
OmmyJay