在 Mocha 中的“描述”之前运行异步代码

bat*_*uck 5 mocha.js node.js

我正在尝试使用 for 循环动态生成测试,但要生成的测试数量是从异步任务中获得的。这是我的代码:

var noOfTestsToRun;

before(function() {
    return someAsyncTask().then(function(result) {
        noOfTestsToRun = result;
    })
});

describe('My Test Suite', function() {
    for (var i = 0; i < noOfTestsToRun; i++) {
        it('Test ' + i, function() {
            //...
        });
    }
});
Run Code Online (Sandbox Code Playgroud)

但是,noOfTestsToRun = result当它到达for循环时似乎没有被执行。

我想知道是否有解决此类问题的方法。谢谢你。

Pra*_*ant 2

将回调传递done给您的before函数。

var noOfTestsToRun;

before(function(done) {
    return someAsyncTask().then(function(result) {
        noOfTestsToRun = result;

        // Complete the async stuff
        done();
    })
});

describe('My Test Suite', function() {
    for (var i = 0; i < noOfTestsToRun; i++) {
        it('Test ' + i, function() {
            //...
        });
    }
});
Run Code Online (Sandbox Code Playgroud)

当您的异步任务完成并被done()调用时,我们告诉 Mocha 异步任务已完成并且可以继续实现预期。

更新

因此,您的目标是让 mocha 运行动态测试。

您可以通过一些技巧来实现这一点。您将需要一个it块来强制before执行。在此之前,您可以it根据异步结果动态生成测试。

before(function() {
    return someAsyncTask().then(function(result) {
        describe('My Test Suite (dynamic)', function() {
            for (var i = 0; i < result; i++) {
                it('Test ' + i, function() {
                    // ...
                });
            }
        });
    });
});

it('should force before to execute', function() {
    console.log('Hack to force before to execute');
});
Run Code Online (Sandbox Code Playgroud)

工作笔