请教如何mocha测试以下2行代码
发布于 7 年前 作者 einsqing 3044 次浏览 来自 问答
// 捕获promise reject错误
process.on('unhandledRejection', function(reason, promise) {
    log(reason);
});

// 捕获未知错误
process.on('uncaughtException', function(err) {
    log(err);
    if (err.message.indexOf(' EADDRINUSE ') > -1) {
        process.exit();
    }
});
6 回复
process.emit('uncaughtException', new Error('23333'));

@lellansin @lellansin 测试下面第二个,mocha进程会退出,下面就不会跑了,该如何是好?

来自 KoaHub.js

自己 mock 一个假的 process 试试?

@lellansin 如何mock?

测试的目的是保证代码逻辑运行正确,并且将来修改代码的时候不会破坏老代码。 process 是一个全局的变量,不是很好直接 mock。你需要先将代码修改为可测试的,比如将 process 作为变量传入函数:

function catchError(handler) {
  handler.on('xxx', function(err) {
    if (err.message.indexOf('yyy') > -1) {
	  handler.exit();
	}
  });
}

然后测试这个函数:如果接受了一个包含 on 方法和 exit 方法的 handler,并且 on 方法的回调的 err.message 包含 yyy 的时候,exit 方法是否被执行了。 这时候 mock process 就很简单了。

理论上单元测试不应该依赖于任何第三方东西,比如这里的 process,比如你代码里面的 require 的库。单元测试应该把这些所有依赖都 mock。这些依赖如果哪天 api 变了,你的测试依然应该能够通过。这才是正确的方式。

因为:

单元测试应该能够迅速的通过测试失败的 message 判断出来是哪个地方出现问题了。如果是你的依赖出问题了,那么你这个测试就不应该报错,否则很难知道到底是你的代码出问题了还是依赖的代码出问题了。

在子进程里面测试即可,可以用 coffee 库。

回到顶部