Использование Sinon для издевательства над константой/переменной?

Я новичок в тестировании и еще новичок в Синон.

Здесь у меня настроен экспресс-маршрут:

import context = require("aws-lambda-mock-context");

this.router.post('/', this.entryPoint);

public entryPoint(req: Request, res: Response, next: NextFunction) {
    const ctx = context();
    alexaService.execute(req.body, ctx);
    ctx.Promise
        .then((resp: Response) => res.status(200).json(resp))
        .catch((err: Error) => res.status(500));
}

Моя цель — проверить правильность выполнения почтового вызова /. Мой тестовый сценарий:

describe('/POST /', () => {
    it('should post', () => {
        chai.request(app)
            .post('/v2')
            .end((err, res) => {
                expect(res).to.be.ok;
            });
    });
});

Хотя мой тест проходит успешно, он возвращает status: 500 из-за того, что const ctx = context() не распознается. Есть ли подходящий/правильный способ шпионить за переменной ctx и возвращать фиктивную переменную в моем тесте с использованием Sinon? Я так долго крутил здесь свои колеса.


person Iqen    schedule 05.03.2017    source источник


Ответы (1)


Это распространенная проблема, с которой я столкнулся сам. Я протестировал несколько решений, и мне кажется, что лучше всего работает Mockery.

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

Для вашего кода это будет выглядеть примерно так:

const mockery = require('mockery');
const { spy } = require('sinon');

describe('/POST /', () => {
    let ctxSpy;
    beforeEach(() => {
        mockery.enable({
            useCleanCache: true,
            warnOnUnregistered: false
        });
        ctxSpy = spy();
        mockery.registerMock('"aws-lambda-mock-context"', ctxSpy);

        // change this to require the module under test
        const myRouterModule = require('my-router-module'); 

        myRouterModule.entryPoint({}, {}, () => {});
        return ctxSpy;
    });

    it('should call ctx', () => {
        expect(ctxSpy).called.to.be.ok;
    });

    afterEach(() => {
        mockery.deregisterAll();
        mockery.disable();
    });
});
person Patrick Hund    schedule 05.03.2017
comment
Я знаю, что это устарело, но я предлагаю вам использовать mockery.registerAllowable, прежде чем запрашивать тестируемый модуль :) - person Philippe Hebert; 26.10.2017
comment
Да, забыл упомянуть об этом, потому что я спрятал это в своей настройке. - person Patrick Hund; 26.10.2017