请教如何mocha测试以下2行代码
// 捕获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 库。