当使用Mocha测试访问内部描述块时,外部描述块中的变量是未定义的

时间:2014-01-31 00:22:49

标签: javascript node.js mocha

我有一个如下所示的测试套件:

(注意顶部的accountToPost变量(位于第一个describe块下方)

describe('Register Account', function () {

    var accountToPost;

    beforeEach(function (done) {
        accountToPost = {
            name: 'John',
            email: 'email@example.com',
            password: 'password123'
        };

        done();
    });

    describe('POST /account/register', function(){

        describe('when password_confirm is different to password', function(){

            //accountToPost is undefined!
            accountToPost.password_confirm = 'something'; 

            it('returns error', function (done) {
              //do stuff & assert
            });
        });
    });
});

我的问题是,当我尝试修改嵌套的describe块中的accountToPost时,它是未定义的......

我该怎么做才能解决这个问题?

1 个答案:

答案 0 :(得分:18)

将分配保留在原来的位置,但在beforeEach回调中包含,代码将执行:

beforeEach(function () {
    accountToPost.password_confirm = 'something';
});

Mocha加载您的文件并执行它,这意味着在 Mocha实际运行测试套件之前,立即执行describe次调用。这就是它如何计算出你宣布的一系列测试。

我通常只将函数和变量声明放在我传递给describe的回调体中。 更改测试中使用的对象状态的所有内容都属于beforebeforeEachafterafterEach,或者位于测试内部。< / p>

要知道的另一件事是beforeEachafterEach在回调it之前和之后执行而不是回调{{1调用。因此,如果您认为describe回调将在beforeEach之前执行,那么这是不正确的。它在describe('POST /account/register', ...之前执行。

这段代码应该说明我在说什么:

it('returns error', ...

如果您在此代码上运行mocha,您将看到以递增顺序输出到控制台的数字。我的结构与您的测试套件的结构相同,但添加了我推荐的修复程序。输出数字0到4,而Mocha正在确定套件中存在哪些测试。测试尚未开始。在测试期间输出其他数字。