Мокко и этот контекст

Итак, у меня есть этот код:

describe('main describe', function() {
    afterEach(function() {
      //this.prop === undefined
    });

    describe('sub', function() {
        it('should do something', function() {
            this.prop = 'test';
        });
    });
});

Я не знаю почему this.prop в mainafterEach является undefined потому что следующий код работает как ожидалось:

describe('main describe', function() {
    afterEach(function() {
      //this.prop === 'test'
    });

    it('should do something', function() {
        this.prop = 'test';
    });
});

Почему первый код не работает так, как я думал, где this.prop должен быть равен 'test' и не undefined?

Это this Ключевое слово привязано только к describe функция это непосредственно содержится?

1 ответ

Решение

Да, каждый describe получает новый Context объект. (Все упомянутые мной классы можно найти в исходном коде Mocha.) Вы можете получить то, что пытаетесь сделать с помощью:

describe('main describe', function() {
    afterEach(function() {
        console.log(this.prop);
    });

    describe('sub', function() {
        it('should do something', function() {
            this.test.parent.ctx.prop = 'test';
        });
    });
});

Линия this.test.parent.ctx.prop это ключ. this это Context связано с it вызов. this.test это Test объект, связанный с it вызов. this.test.parent это Suite объект, связанный с describe вызов, который сразу же содержит it вызов. this.test.parent.ctx это контекст, в котором describe появляется вызов, который оказывается в том же контексте, что и this в afterEach вызов.

На самом деле, я бы порекомендовал не обходить внутренние структуры Mocha и вместо этого делать что-то вроде:

describe('main describe', function() {
    var prop;
    afterEach(function() {
        console.log(prop);
    });

    describe('sub', function() {
        it('should do something', function() {
            prop = 'test';
        });
    });
});
Другие вопросы по тегам