(я перемещаю его к ответу, чтобы ветка комментариев не заполнялась - и поэтому я могу печатать больше).
Ключ в том, чтобы правильно понять асинхронность вашего кода. myFoo
кажется асинхронным, поэтому вам нужно решить, будут ли все ошибки или режимы сбоя обрабатываться как ошибки, передаваемые его обработчику обратного вызова, или некоторые типы ошибок должны возвращать синхронные ошибки самому вызывающему myFoo
. Мой общий подход заключается в том, что если какие-либо ошибки проходят через обработчик обратного вызова, чтобы все они проходили туда - за небольшим исключением некоторых типов ошибок плохого кодирования (например, передача неправильных типов или передача нулевых аргументов для аргументов). это всегда должно иметь переменные), которые я мог бы 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