变量范围如何在Mocha测试框架内工作?

mcv*_*rry 15 scope anonymous-function mocha.js node.js

我是javascript,node.js,mocha等所有东西的相对新手.

在我的代码中,我有一个Unit对象,它有一个disable()将disabled属性设置为true,并isDisabled()返回disabled属性.它还有一种方法nextTurnReset()可以在下一回合开始时重置单位.我编写了一个测试套件来测试这种行为.我首先禁用该对象,然后尝试测试它是否被禁用.但是,我在第一次测试中的单位变量 - 在传递给Mocha it()方法的匿名函数内- 处于非禁用状态,正如我在节点的调试器中观察到的那样.

describe('#disable()', function() {
    var unit = tests.newUnit();
    unit.disable();
    debugger;
    it('disabled off turn?', function() {
        debugger;
        (unit.isDisabled()).should.be.exactly(true);
    });
    unit.nextTurnReset();
    it('disabled on next turn?', function() {
        (unit.isDisabled()).should.be.exactly(true);
    });
    unit.nextTurnReset();
    it('disabled on 2nd turn?', function() {
        (unit.isDisabled()).should.be.exactly(false);
    });
});
Run Code Online (Sandbox Code Playgroud)

对于记录,前两个测试失败,最后一个测试成功,表明该单元从未被禁用.

从使用节点调试器的repl:在第一个debugger;语句之后unit.disabled == true,但在第二个debugger;语句之后unit.disabled == false.我希望两种情况下的值都为真.

知道为什么会这样吗?另外,编写Mocha测试以获得预期结果的正确方法是什么?

非常感谢!

Lou*_*uis 15

Mocha中的变量范围与任何其他JavaScript代码完全相同.您的问题是您没有意识到Mocha将以何种顺序执行您的代码.这是发生的事情:

  1. 您可以创建单元实例并对其进行调用disable.

  2. 您注册了第一个测试.这就是it:它为未来的执行注册了一个测试.测试现在不执行.

  3. 你调用unit.nextTurnReset();它会重置对象的状态.

  4. 你注册了第二次测试.同样它现在不执行.

  5. 您再次重置对象.

  6. 您注册了上一次测试.

在此之后,Mocha接受您注册的测试并运行它们.当您的测试运行时,您的对象处于其重置状态,而不是禁用.

在我看来,鉴于您描述的所需行为,您的代码应该是:

describe('#disable()', function() {
    var unit = tests.newUnit();

    beforeEach(function () {
        unit.nextTurnReset();
    });

    it('disabled off turn?', function() {
        unit.disable();
        (unit.isDisabled()).should.be.exactly(true);
    });

    it('disabled on next turn?', function() {
        (unit.isDisabled()).should.be.exactly(false);
    });
});
Run Code Online (Sandbox Code Playgroud)

传递给的代码beforeEach在您注册的每个测试之前运行,因此它会在正确的时间重置对象.