Мокко и этот контекст
Итак, у меня есть этот код:
describe('main describe', function() {
afterEach(function() {
//this.prop === undefined
});
describe('sub', function() {
it('should do something', function() {
this.prop = 'test';
});
});
});
Я не знаю почему this.prop
в main
afterEach
является 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';
});
});
});