错误:异步挂钩堆栈在节点js中已损坏

时间:2018-06-03 07:12:49

标签: node.js unit-testing mocha

我正在使用mocha

为我的Node JS应用程序编写测试

在我的测试中,我模拟了1个函数(正在调用HTTP Url),对于某些条件,我已经添加了1秒的睡眠。

由于mocha测试中的睡眠功能,我得到的是异常。在实际应用中,它工作正常。

  

错误:异步挂钩堆栈已损坏(实际:18,预期:   19)1:v8 :: SnapshotCreator :: default构造函数闭包2:

     

node :: CallbackScope :: ~CallbackScope 3:

     

node :: CallbackScope :: ~CallbackScope 4:RAND_query_egd_bytes 5:

     

RAND_query_egd_bytes 6:uv_timer_get_repeat 7:uv_run 8:

     <00> 000007FEF8771261 9:000007FEF87710B6 10:

     

v8 :: internal :: wasm :: SignatureMap :: Find 11:

     

v8 :: internal :: Builtins :: CallableFor 12:

     

v8 :: internal :: Builtins :: CallableFor 13:

     

v8 :: internal :: Builtins :: CallableFor 14:000002E6363043C1

以下是 moched功能的代码。

somefunction() //In Mock test
{
    let current_time = Math.round((new Date()).getTime() / 1000);
    if (last_execution_time == current_time) {
        admin_delete_user_count++;
        if (admin_delete_user_count >= 3) {
            callback({
                stack: "TooManyRequestsException: Rate exceeded",
                "code": "TooManyRequestsException",
                "statusCode": 400
            }, undefined);
            return;
        }
    } else {
        admin_delete_user_count = 0;
        last_execution_time = Math.round((new Date()).getTime() / 1000);
    }
    callback(undefined, "Test");
}

以下是我的节点js应用程序中的实际函数,它在我从上面的代码发送异常后导致问题。

somefunction() // In Real applicatio
{
    if (err) {
        if (err.code == "TooManyRequestsException") {
            logger.log("INFO", "TooManyRequestsException, So wait a while for 1 second and retry");
            index = index - 1;
            sleep(1000); // THIS IS CAUSING THE ISSUE
        }
    } else {
        console.log("deletedUsers:" + JSON.stringify(deletedUsers));
    }
}

任何帮助?

1 个答案:

答案 0 :(得分:0)

我发现了上面列出的问题。

基本上存在250ms的超时,这导致异步挂钩生命周期中的问题。

我改变了

timeout.timeout('waitTimer', 250,
   function() {
     expect(res.statusCode).to.equal(200);
     done();
   }
);

timeout.timeout('waitTimer', 1250,
   function() {
     expect(res.statusCode).to.equal(200);
     done();
   }
);

谢谢!