0

所以我一直在使用 AWS Lambda 和 NodeJS 6.10 开发一些代码。由于我缺乏集成测试方面的知识(别担心,单元测试已经完成),我没有测试我的代码。当然,我错过了一个导致两个不眠之夜的错误。即使在我放入这个之后它也会继续运行

return workerCallback(err);

我认为它会阻止该函数在 if 子句之后运行其他代码,因为我返回了它。无论如何,我可以通过在异步函数之后添加一个返回来解决我的问题

SQSService.deleteMessage

叫做。其余代码没有运行,lambda 函数按预期运行并结束。

现在是按预期工作的代码。

function myFoo(currentRequest,event, workCallback){

    var current_ts = moment();
    var req_ts = moment(currentRequest.request_timestamp);

    if (req_ts.diff(current_ts, 'minutes') > 5) {
    SQSService.deleteMessage(event.ReceiptHandle, function(err, data){
        if (err) {
            return workerCallback(err);
        } else {
            return workerCallback(null, "Request stale! Deleting from queue...");
        }
    }); //end of SQS Service
        return; //This line... this line!
    }

    /* Codes below will execute because the code above is asynchronous
       but it should not as the asynchronous code above is a terminator function 
    from a business logic point of view
    */

    //more codes that will run should currentRequest.request_timestamp is 5 minutes past

 }

有人可以指导我如何测试此代码或创建一个至少可以防止我再次犯同样错误的测试吗?我想通过测试避免这些错误再次发生。谢谢!

4

1 回答 1

1

(我将其移至答案,因此评论线程不会填满 - 因此我可以输入更多内容)。

关键是要正确掌握代码中的异步性。 myFoo似乎是异步的,因此您需要决定是否应将所有错误或故障模式作为传递给其回调处理程序的错误进行处理,或者某些类型的错误是否应将同步错误返回给myFoo自身的调用者。我的一般方法是,如果有任何错误通过回调处理程序,让它们都去那里 - 除了某些类型的错误编码错误的小例外(例如传递错误类型的东西,或为参数传递 null那应该总是有变量),我可能throw Error()会这样做。但是如果出现这种错误(project_ref_no == null) 是您应该优雅地处理的那种错误,那么我可能会将它传递给错误处理程序。一般的想法是,当您调用 myFoo 并返回时,您所知道的是某些工作将在某个时间完成,但您不知道会发生什么(并且不会得到结果在响应中) - 响应将在稍后调用回调处理程序时返回)。

但是,更重要的是,了解哪些代码正在立即运行以及哪些代码在回调处理程序中是关键。你被绊倒了,因为你想象内部生成的回调处理程序(传递给SQSService.deleteMessage)正在运行时调用 myFoo.

至于测试策略,我认为将异步调用(带有回调处理程序)误认为是同步运行的代码的问题没有灵丹妙药。你可以在所有地方(你认为代码永远不应该到达的地方)撒上断言或throw Error()',但这会使你的代码变得荒谬。

Typescript 对此有所帮助,因为您可以定义函数返回类型,并且如果您的代码路径不返回该类型的内容(大多数/全部?类型化语言给您),您的 IDE 应该给您一个警告) - 这会有所帮助,但它不会捕获所有情况(例如返回 void 的函数)。

如果您不熟悉 javascript 和/或 javascript 的异步模型,您可以查看以下链接:

https://medium.com/codebuddies/getting-to-know-asynchronous-javascript-callbacks-promises-and-async-await-17e0673281ee

于 2018-05-02T08:41:19.673 回答