我有一个如下所示的测试套件:
(注意顶部的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
时,它是未定义的......
我该怎么做才能解决这个问题?
答案 0 :(得分:18)
将分配保留在原来的位置,但在beforeEach
回调中包含,代码将执行:
beforeEach(function () {
accountToPost.password_confirm = 'something';
});
Mocha加载您的文件并执行它,这意味着在 Mocha实际运行测试套件之前,立即执行describe
次调用。这就是它如何计算出你宣布的一系列测试。
我通常只将函数和变量声明放在我传递给describe
的回调体中。 更改测试中使用的对象状态的所有内容都属于before
,beforeEach
,after
或afterEach
,或者位于测试内部。< / p>
要知道的另一件事是beforeEach
和afterEach
在回调it
之前和之后执行而不是回调{{1调用。因此,如果您认为describe
回调将在beforeEach
之前执行,那么这是不正确的。它在describe('POST /account/register', ...
之前执行。
这段代码应该说明我在说什么:
it('returns error', ...
如果您在此代码上运行mocha,您将看到以递增顺序输出到控制台的数字。我的结构与您的测试套件的结构相同,但添加了我推荐的修复程序。输出数字0到4,而Mocha正在确定套件中存在哪些测试。测试尚未开始。在测试期间输出其他数字。