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将以何种顺序执行您的代码.这是发生的事情:
您可以创建单元实例并对其进行调用disable.
您注册了第一个测试.这就是it:它为未来的执行注册了一个测试.测试现在不执行.
你调用unit.nextTurnReset();它会重置对象的状态.
你注册了第二次测试.同样它现在不执行.
您再次重置对象.
您注册了上一次测试.
在此之后,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在您注册的每个测试之前运行,因此它会在正确的时间重置对象.