Mocha beforeEach и afterEach во время тестирования

Я пытался проверить мой тестовый сервер с помощью мокко. Это следующий код, который я использую, почти такой же, как в другом похожем посте.

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');
});

проблема в том, что когда я выполняю этот черновик, ни один из файла console.log, который ожидается увидеть, не отображается в командной строке. Не могли бы вы объяснить мне, что я делаю не так?

Ответ 1

Георгий прав, что вам нужен вызов it, чтобы указать тест, но вам не нужно иметь верхний уровень describe в вашем файле, если вы этого не хотите. Вы можете заменить одиночный describe на кучу вызовов it:

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

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

Это очень хорошо работает, если ваш тестовый пакет небольшой и состоит только из одного файла.

Если ваш тестовый набор больше или распространен среди нескольких файлов, я бы очень сильно предложил разместить ваши beforeEach и afterEach вместе с вашим it внутри describe, если только вы абсолютно уверены, что для каждого теста в наборе требуется работа, выполняемая beforeEach или afterEach. (Я написал несколько тестовых наборов с Mocha, и у меня никогда не было beforeEach или afterEach, которое мне нужно было запускать для каждого отдельного теста.) Что-то вроде:

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

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

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

Если вы не разместите beforeEach и afterEach внутри describe, как это, скажем, у вас есть один файл для проверки веб-сокетов и другого файла для проверки некоторых операций с базой данных. Тесты в файле, который содержит тесты на работу с базой данных, также будут иметь ваши beforeEach и afterEach, выполненные до и после них. Размещение beforeEach и afterEach внутри describe, как показано выше, гарантирует, что они будут выполняться только для ваших тестов веб-сокетов.

Ответ 2

У вас нет тестов в вашем примере. Если нет тестов для запуска, то до и после перехвата не будут вызываться. Попробуйте добавить тест, например:

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

Ответ 3

Для выполнения перехватов beforeEach() и afterEach() вам нужно иметь тестовый обратный вызов (например, it) внутри suite-callback (например, describe). Больше информации https://mochajs.org/#run-cycle-overview