Никакой новый экземпляр класса не создан после вызова new class () в тесте jest - PullRequest
0 голосов
/ 29 ноября 2018

Выпуск

Создание нового экземпляра класса в модульном тесте не вызывает конструктор.


Подробности

Я пытаюсь проверить, возникла ли ошибка приуказан неверный IP-адрес сервера, однако, когда я пытаюсь создать новый экземпляр класса, который должен выдать ошибку, он не работает.

Класс, который я пытаюсь проверить:

export class ClassA {
    private readonly _redisServerIP = config.redisServerIP;
    private readonly _redisServerPort = config.redisServerPort;

    constructor() {
        console.log(this._redisServerIP);
        this.configure();
    }

    private configure(): void {
        this._redisSub = redis.createClient({host: this._redisServerIP, port: this._redisServerPort});

        this._redisSub.on('error', (error) => {
            if (error.code === "ECONNREFUSED") {
                this._logger.error('Could not create a redisSub, is the redis server running?');
            }
            throw new Error('Something bad happened');
        });
    }
}

Это мой тестовый код:

import * as constants from '../src/config/config';

let socket;
let classA;
let httpServerAddr;

beforeAll((done) => {
classA = new ClassA();
    httpServerAddr = classA.getServerIp();
    done();
});

afterAll((done) => {
    done();
});

beforeEach((done) => {

});

afterEach((done) => {
    done();
});

describe('Socket.io redis testing', () => {
    test('should fail due to invalid serverIP', () => {
        constants.config.redisServerIP = "0.0.0.0";
        classA = null;

        expect(() => {
            classA = new ClassA();
        }).toThrow();
    });
});

Я вижу ip сервера только один раз в консоли моего узла, и тест не пройден из-за следующей ошибки:

expect(function).toThrow(undefined)
Expected the function to throw an error.
But it didn't throw anything.

Этопотому что каждый тест выполняется по-своему?И когда он работает в том, что сказал обещание не может войти в консоль?Или это из-за того, что я не очистил существующий экземпляр ClassA перед вызовом нового ClassA ()?

====== EDIT ======

После использования точек останова я понял, что конструктор вызывается, однако он не записывает данные в консоль.Но бросок никогда не происходит, как работает redis;если возникает ошибка, на сервер Redis отправляется событие с именем «error», оно не запускается при выполнении теста, как можно ждать, пока оно сработает?

1 Ответ

0 голосов
/ 03 декабря 2018

Я решил эту проблему, сделав публичный redisSub и вызвав process.exit ();когда соединение не удалось, в модульном тесте я spyOn process.exit () и проверить, был ли он вызван.

Это тестовый код:

describe('Socket.io redis testing', () => {
    test('should fail due to invalid serverIP', () => {
        const mockExit = jest.spyOn(process, 'exit').mockImplementation(() => {});

        constants.config.redisServerIP = "127.312.12.1";

        classA.stopServer();
        classA = null;
        classA = new ClassA();

        classA.redisSub.on('error', () => {
            expect(mockExit).toHaveBeenCalledWith(1);
        });
        mockExit.mockRestore();
    });

Хотя использованиесобытия в ClassA также сработали бы, я не думал, что это было бы самое элегантное решение.

...