所以我一直在使用 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
}
有人可以指导我如何测试此代码或创建一个至少可以防止我再次犯同样错误的测试吗?我想通过测试来避免这些错误再次发生。谢谢!
最佳答案
(我将其移至答案,这样评论线程就不会填满 - 这样我就可以输入更多内容)。
关键是正确掌握代码中的异步性。 myFoo
似乎是异步的,因此您需要决定是否所有错误或故障模式都应作为传递给其回调处理程序的错误进行处理,或者某些类型的错误是否应将同步错误返回给 myFoo
的调用者本身。我的一般方法是,如果有任何错误正在通过回调处理程序,则将它们全部发送到那里 - 除了某些类型的错误编码错误(例如,传递错误类型的内容,或传递 null 作为参数)应该总是有变量)我可能 throw Error()
为了。但是,如果这种错误( project_ref_no == null
)是您应该妥善处理的错误,那么我可能会将其传递给错误处理程序。一般的想法是,当你调用 myFoo 并且它返回时,你所知道的是某些工作将在某个时刻完成,但你不知道会发生什么(并且不会得到结果)在响应中) - 响应将在稍后调用回调处理程序时返回)。
但是,更重要的是,了解哪些代码正在立即运行以及回调处理程序中包含哪些代码是关键。你被绊倒了,因为你在心里想象当你调用 myFoo 时内部生成的回调处理程序(传递给 SQSService.deleteMessage
)正在运行。
至于测试策略,我认为对于将异步调用(使用回调处理程序)误认为同步运行的代码的问题没有 Elixir 。您可以撒上断言或 throw Error()
到处都是(你认为代码永远不应该到达的地方),但这会让你的代码变得荒谬。
Typescript 对此有所帮助,因为您可以定义函数返回类型,并且如果您的代码路径不返回该类型的内容(大多数/全部?键入的内容),您的 IDE 应该向您发出警告语言给你) - 这会有所帮助,但它不会捕获所有情况(例如返回 void 的函数)。
如果您不熟悉 javascript 和/或 javascript 的异步模型,您可以查看以下链接:
关于javascript - 为异步方法创建测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50129922/