Модульное тестирование и продолжение - локальное хранилище - PullRequest
0 голосов
/ 06 марта 2019

Я хотел бы использовать CLS (локальное хранилище с продолжением) в своем приложении TypeScript, чтобы у меня было где-нибудь, где я могу поместить метаданные (например, идентификатор пользователя, идентификатор запроса) для различных целей (например, ведение журнала), не передавая данные вкаждый вызов метода.

Я попытался использовать cls-hooked и async-local-storage .Тем не менее, я не смог заставить работать ни одного из моих модульных тестов Jest.

const als = require('async-local-storage');
als.enable();

// ... some code

describe('Authorization tests', () => {
  test('Cannot call without correct scope', () => {
    als.set('id', "123123123123");
    expect(() => service.registerApp(ctxt, app)).toThrowError(AuthorizationError.NOT_AUTHORIZED);
  });
});

Приведенная выше настройка базы данных id не дает сбоя.

export function authorize(requiredPermissions: string[]) {
    return (target: any, name: any, descriptor: any) => {
        const protectedFunction = descriptor.value;
        const als = require('async-local-storage');
        console.log(`>>>>>>>>>My ID ${als.get('id')}`);

        // ... some code
    }
}

Однаковышеприведенный код просто выводит:

>>>>>>>>>My ID null

Возможно ли то, что я пытаюсь сделать?Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 07 марта 2019

Мне удалось решить мою проблему без необходимости в зависимости jest-localstorage-mock. Короче говоря, мой get(...) звонок пытался прочитать хранилище до того, как были включены асинхронные перехватчики, что является требованием согласно документации . Кроме того, мой get(...) звонок пытался прочитать магазин слишком рано; поскольку я пытаюсь сделать это в декораторе, мне нужно переместить вызов get в descriptor.value, что фактически выполняется во время выполнения.

Мой обновленный производственный код теперь включает вызов enable(), вызов get(...) находится в правильном месте, и все хорошо:

const als = require('async-local-storage'); // pulled up to top of file
als.enable(); // added

export function authorize(requiredPermissions: string[]) {
    return (target: any, name: any, descriptor: any) => {
        const protectedFunction = descriptor.value;

        descriptor.value = function() {
            console.log(`>>>>>>>>>My ID ${als.get('id')}`); // moved into function
            // ... some code
        }
    }
}
0 голосов
/ 06 марта 2019

Поскольку Jest, похоже, не поддерживает localStorage, вам нужно вместо этого смоделировать его.

Я бы предложил использовать для этого библиотеку, такую ​​как https://www.npmjs.com/package/jest-localstorage-mock, так как в противном случае вам пришлось бы реализовать все это самостоятельно.

Вам нужно добавить эту библиотеку в devDependencies и добавить ее в качестве файла установки для jest в файле package.json:

{
  "jest": {
    "setupFiles": ["jest-localstorage-mock"]
  }
}

После этого ваши тесты должны пройти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...