Предотвращение скаффолдинга / установки класса Typescript в одном mocha, это функция мешает другому? - PullRequest
0 голосов
/ 24 июня 2018

Я пишу тесты машинописи в Mocha и определил тест следующим образом:

    describe("IsDefined", () => {
    it("should work right ...", () => {
        class Test {
        @IsDefined() p1: String = "";
        @IsDefined() p2: Date = new Date();
        @IsDefined() p3: Number = 0;
        }

Затем внутри другого теста в том же блоке describe я переопределяю класс Test следующим образом:

    it("should have accurately mapped ValidationContext values.", () => {
        const options: ValidationOptions = {
        each: true,
        message: "Wazzzzaaaaaaapppppp????!!!!"
        };

        class Test {
        @IsDefined(options) p1: String = "";
        @IsDefined(options) p2: Date = new Date();
        @IsDefined(options) p3: Number = 0;
        }

        const instance = new Test();

Это не сработало.Каким-то образом класс Test из более раннего метода it все еще используется для создания instance, который я создаю, поэтому параметры, передаваемые в декоратор, не отображаются.

Если я переименуюкласс до Test2, тогда я получаю правильный результат, но я предпочитаю не полагаться на правильное именование классов, используемых в настройке.

Как правильно настроить каждый метод перед it, чтобыэтого не происходит?

1 Ответ

0 голосов
/ 27 июня 2018

На самом деле хорошо, что Mocha не пытается выделить определения классов машинописи для конкретной области тестирования.Например, декораторы, которые запускаются на экземплярах классов, могут выдавать недопустимое состояние, если во время выполнения загружено несколько определений одного и того же класса.Это произошло, когда я работал с вышеизложенным, и в результате я получил гораздо лучший дизайн кэша.Вот оно:

    /**
    * If the ValidationContext instance is absent it is created, otherwise
    * the context is placed in the cache specific to the class decorated.
    * @param key 
    * @param vc
    * @throws Error if attempting to add a ValidationContext that has already been added
    * 
    * The exception thrown indicates that duplicate class definition exist in the runtime.
    */
    private static pushIfAbsent(key: string, vc: ValidationContext):void {
        if (this.cache[key] == null) {
        const validationContextMap: IValidationContextIndex = {};
        validationContextMap[vc.getSignature()]= vc;
        this.cache[key] = validationContextMap;
        } else {
        if (this.cache[key][vc.getSignature()]) {
            throw new Error(`The ValidationContainer already contains context with signature ${vc.getSignature()}.`);
        }
        this.cache[key][vc.getSignature()]=vc;
        }
    }

Поэтому я считаю, что это функция Мокко, а не ошибка.Если вы определяете один и тот же класс в нескольких тестовых случаях, он будет давать дубликаты определений времени выполнения, и это может быть использовано для влияния тест-декоратора на состояние, в котором хранится результат реализаций декоратора.

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

...