摩卡和这个背景

时间:2014-12-19 23:39:18

标签: javascript unit-testing mocha

所以我有这段代码:

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

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

我不知道this.prop mainafterEachundefined的原因是describe('main describe', function() { afterEach(function() { //this.prop === 'test' }); it('should do something', function() { this.prop = 'test'; }); }); ,因为以下代码按预期工作:

'test'

为什么第一个代码不起作用,尽管this.prop应该等于undefined而不是this

describe关键字是否仅与其直接包含的{{1}}函数相关联?

1 个答案:

答案 0 :(得分:20)

是的,每个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电话相关联的itthis.test是与Test调用关联的it对象。 this.test.parent是与Suite调用相关联的describe对象,该调用会立即包含it调用。 this.test.parent.ctxdescribe调用出现的有效上下文,恰好与this调用中的afterEach相同。< / p>

我实际上建议不要遍历Mocha的内部结构,而是执行以下操作:

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

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