create-spy.d.ts 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. import {AnyCallable, MethodKey} from './types.js';
  2. /**
  3. * Информация о единичном вызове
  4. * отслеживаемой функции.
  5. *
  6. * @template Args
  7. * @template Return
  8. */
  9. export interface CallInfo<Args extends any[] = any[], Return = any> {
  10. /**
  11. * Аргументы, с которыми был вызван шпион.
  12. */
  13. readonly args: Args;
  14. /**
  15. * Контекст this, с которым был вызван шпион.
  16. */
  17. readonly thisArg: any;
  18. /**
  19. * Значение, возвращенное шпионом.
  20. * (undefined, если шпион выбросил ошибку)
  21. */
  22. readonly returnValue: Return | undefined;
  23. /**
  24. * Ошибка, выброшенная шпионом.
  25. * (undefined, если шпион не выбросил ошибку)
  26. */
  27. readonly error: unknown | undefined;
  28. }
  29. /**
  30. * Представляет функцию-шпиона, созданную `createSpy`.
  31. * Это вызываемая функция, которая также имеет свойства
  32. * и методы для инспекции вызовов.
  33. *
  34. * @template TFunc
  35. */
  36. export interface Spy<TFunc extends AnyCallable = AnyCallable> {
  37. /**
  38. * Сама функция-шпион.
  39. */
  40. (...args: Parameters<TFunc>): ReturnType<TFunc>;
  41. /**
  42. * Вызовы шпиона.
  43. *
  44. * @readonly
  45. */
  46. readonly calls: CallInfo[];
  47. /**
  48. * Количество вызовов шпиона.
  49. *
  50. * @readonly
  51. */
  52. readonly callCount: number;
  53. /**
  54. * Булево значение, указывающее,
  55. * был ли шпион вызван хотя бы один раз.
  56. *
  57. * @readonly
  58. */
  59. readonly isCalled: boolean;
  60. /**
  61. * Восстанавливает оригинальный метод,
  62. * если шпион был создан для метода объекта.
  63. * Ничего не делает, если шпион был создан
  64. * для отдельной функции.
  65. */
  66. restore(): void;
  67. }
  68. /**
  69. * Создает шпиона.
  70. */
  71. export function createSpy(): Spy<(...args: any[]) => void>;
  72. /**
  73. * Создает шпиона для отдельной функции.
  74. *
  75. * @param targetFn
  76. * @param customImpl
  77. */
  78. export function createSpy<TFunc extends AnyCallable>(
  79. targetFn: TFunc,
  80. customImpl?: TFunc,
  81. ): Spy<TFunc>;
  82. /**
  83. * Создание шпиона для метода объекта. Оригинальный метод
  84. * объекта будет заменен шпионом. Используйте `spy.restore()`
  85. * для восстановления оригинального метода.
  86. *
  87. * @param targetObject
  88. * @param methodName
  89. * @param customImpl
  90. */
  91. export function createSpy<TObj extends object, K extends MethodKey<TObj>>(
  92. targetObject: TObj,
  93. methodName: K,
  94. customImpl?: TObj[K],
  95. ): Spy<Extract<TObj[K], AnyCallable>>;