所以我一直在使用带有NodeJS 6.10的AWS Lambda开发一些代码。由于我缺乏集成测试的知识(不用担心,单元测试已经完成),我没有测试我的代码。当然,我错过了导致两个不眠之夜的错误。在我加入
之后它仍然继续运行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
}
有人可以指导我如何测试此代码或创建一个至少可以阻止我再次犯同样错误的测试吗?我想通过测试来避免再次发生这些错误。谢谢!
答案 0 :(得分:1)
(我正在将其移至答案,因此评论主题不会填满 - 所以我可以输入更多内容。)
关键是要正确掌握代码中的异步。 myFoo
似乎是异步的,因此您需要决定是否应将所有错误或失败模式作为传递给其回调处理程序的错误来处理,或者某些类型的错误是否应将同步错误返回给{{1}的调用者本身。我的一般方法是,如果有任何错误通过回调处理程序,让它们都去那里 - 除了某些类型的错误编码错误(例如传递错误类型的东西,或者为参数传递null)应该总是有变量)我可能myFoo
。但是如果这种错误(throw Error()
)是你应该优雅处理的那种错误,那么我可能会将它传递给错误处理程序。一般的想法是,当你调用myFoo并返回时,你所知道的是,某些工作将在某个时刻完成,但你不知道将会发生什么(并且不会得到结果在响应中) - 响应将在稍后调用回调处理程序时返回。
但是,更重要的是,理解正在运行的代码以及回调处理程序中的代码是关键。你被绊倒是因为你在心理上想象了当你调用myFoo时正在运行内部生成的回调处理程序(传递给project_ref_no == null
)。
至于测试策略,我认为错误的异步调用(使用回调处理程序)与同步运行的代码的问题没有灵丹妙药。你可以在所有地方(你认为代码永远不会到达的地方)撒上断言或SQSService.deleteMessage
,但这会让你的代码变得荒谬。
Typescript对此有所帮助,因为您可以定义一个函数返回类型,如果您的代码路径没有返回该类型的东西(大多数/全部?键入的东西),IDE会给您一个警告语言给你) - 这会有所帮助,但它不会捕获所有情况(例如返回void的函数)。
如果您不熟悉javascript和/或javascript的异步模型,可以查看以下链接: