异步测试

Mocha 支持异步测试。

请打开 06.async,并进入该目录中。

1. done() 方法

如果是异步测试,需要额外调用 done() 方法,例如 timeout.test.js 文件中:

it('测试应该5000毫秒后结束', function(done) {
  var x = true;
  var f = function() {
    x = false;
    expect(x).to.be.not.ok;
    done(); // 通知Mocha测试结束
  };
  setTimeout(f, 4000);
});

当回调参数中传入了 done 之后,Mocha 就会认为这是异步方法,必须显式调用 done(),以便通知 Mocha “测试已结束”。可以 查看此处 获得更多信息。

2. 测试用例执行超时

上面提到异步方法测试时,Mocha 会等到被调用了 done() 方法之后才认为测试已结束,但显然这个“等待”不会是无限长的。Mocha 默认每个测试用例最多执行 2000 毫秒,如果到时没有得到结果,就报错。

对于涉及异步操作的测试用例,这个时间往往是不够的,需要用 -t--timeout 参数指定超时门槛。如果单位为秒,则需要使用 s,例如 --timeout 2s or --timeout 2000

当我们执行如下命令时,被提示 Timeout,原因是 timeout.test.js 中的用例需要在 4000 ms 之后才运行结果,已经超过了 2000 ms

mocha test/timeout.test.js

使用 -t--timeout 参数,改变默认的超时设置。

mocha test/timeout.test.js --timeout 5000

3. 高亮显示超时的测试用例时间

Mocha 默认会高亮显示超过 75 毫秒的测试用例(比如上面的执行时间就变为了红色),可以用 -s--slow 调整这个参数。

mocha test/timeout.test.js --timeout 5000 -s 5000

上面的命令指定高亮显示耗时超过 5000 毫秒的测试用例。

4. CGI 请求的例子

async.test.js 这个例子中,我们演示了 CGI 请求的例子,这是非常典型的异步场景测试。

it('异步请求应该返回一个对象', function(done) {
    request
        .get('https://api.github.com')
        .end(function(err, res) {
            expect(res).to.be.an('object');
            done();
        });
});

执行命令:

mocha test/async.test.js --timeout 10000

5. Mocha 内置对 Promise 的支持

Mocha 内置 对 Promise 的支持,允许直接返回 Promise,等到它的状态改变,再执行断言,而不用显式调用 done 方法。

我们对上例的CGI请求做一些修改,请看promise.test.js

it('异步请求应该返回一个对象', function() {
    return fetch('https://api.github.com')
        .then(function(res) {
            return res.json();
        }).then(function(json) {
            expect(json).to.be.an('object');
        });
});

执行命令:

mocha test/promise.test.js --timeout 10000

results matching ""

    No results matching ""