@@ -45,19 +45,36 @@ class MockFunctionContext {
45
45
this.#times = times;
46
46
}
47
47
48
+ /**
49
+ * Gets an array of recorded calls made to the mock function.
50
+ * @returns {Array} An array of recorded calls.
51
+ */
48
52
get calls() {
49
53
return ArrayPrototypeSlice(this.#calls, 0);
50
54
}
51
55
56
+ /**
57
+ * Retrieves the number of times the mock function has been called.
58
+ * @returns {number} The call count.
59
+ */
52
60
callCount() {
53
61
return this.#calls.length;
54
62
}
55
63
64
+ /**
65
+ * Sets a new implementation for the mock function.
66
+ * @param {Function} implementation - The new implementation for the mock function.
67
+ */
56
68
mockImplementation(implementation) {
57
69
validateFunction(implementation, 'implementation');
58
70
this.#implementation = implementation;
59
71
}
60
72
73
+ /**
74
+ * Replaces the implementation of the function only once.
75
+ * @param {Function} implementation - The substitute function.
76
+ * @param {number} [onCall] - The call index to be replaced.
77
+ */
61
78
mockImplementationOnce(implementation, onCall) {
62
79
validateFunction(implementation, 'implementation');
63
80
const nextCall = this.#calls.length;
@@ -66,6 +83,9 @@ class MockFunctionContext {
66
83
this.#mocks.set(call, implementation);
67
84
}
68
85
86
+ /**
87
+ * Restores the original function that was mocked.
88
+ */
69
89
restore() {
70
90
const { descriptor, object, original, methodName } = this.#restore;
71
91
@@ -79,14 +99,25 @@ class MockFunctionContext {
79
99
}
80
100
}
81
101
102
+ /**
103
+ * Resets the recorded calls to the mock function
104
+ */
82
105
resetCalls() {
83
106
this.#calls = [];
84
107
}
85
108
109
+ /**
110
+ * Tracks a call made to the mock function.
111
+ * @param {object} call - The call details.
112
+ */
86
113
trackCall(call) {
87
114
ArrayPrototypePush(this.#calls, call);
88
115
}
89
116
117
+ /**
118
+ * Gets the next implementation to use for the mock function.
119
+ * @returns {Function} The next implementation.
120
+ */
90
121
nextImpl() {
91
122
const nextCall = this.#calls.length;
92
123
const mock = this.#mocks.get(nextCall);
@@ -109,11 +140,23 @@ class MockTracker {
109
140
#mocks = [];
110
141
#timers;
111
142
143
+ /**
144
+ * Returns the mock timers of this MockTracker instance.
145
+ * @returns {MockTimers} The mock timers instance.
146
+ */
112
147
get timers() {
113
148
this.#timers ??= new MockTimers();
114
149
return this.#timers;
115
150
}
116
151
152
+ /**
153
+ * Creates a mock function tracker.
154
+ * @param {Function} [original] - The original function to be tracked.
155
+ * @param {Function} [implementation] - An optional replacement function for the original one.
156
+ * @param {object} [options] - Additional tracking options.
157
+ * @param {number} [options.times=Infinity] - The maximum number of times the mock function can be called.
158
+ * @returns {ProxyConstructor} The mock function tracker.
159
+ */
117
160
fn(
118
161
original = function() {},
119
162
implementation = original,
@@ -137,6 +180,17 @@ class MockTracker {
137
180
return this.#setupMock(ctx, original);
138
181
}
139
182
183
+ /**
184
+ * Creates a method tracker for a specified object or function.
185
+ * @param {(object | Function)} objectOrFunction - The object or function containing the method to be tracked.
186
+ * @param {string} methodName - The name of the method to be tracked.
187
+ * @param {Function} [implementation] - An optional replacement function for the original method.
188
+ * @param {object} [options] - Additional tracking options.
189
+ * @param {boolean} [options.getter=false] - Indicates whether this is a getter method.
190
+ * @param {boolean} [options.setter=false] - Indicates whether this is a setter method.
191
+ * @param {number} [options.times=Infinity] - The maximum number of times the mock method can be called.
192
+ * @returns {ProxyConstructor} The mock method tracker.
193
+ */
140
194
method(
141
195
objectOrFunction,
142
196
methodName,
@@ -216,6 +270,18 @@ class MockTracker {
216
270
return mock;
217
271
}
218
272
273
+ /**
274
+ * Mocks a getter method of an object.
275
+ * This is a syntax sugar for the MockTracker.method with options.getter set to true
276
+ * @param {object} object - The target object.
277
+ * @param {string} methodName - The name of the getter method to be mocked.
278
+ * @param {Function} [implementation] - An optional replacement function for the targeted method.
279
+ * @param {object} [options] - Additional tracking options.
280
+ * @param {boolean} [options.getter=true] - Indicates whether this is a getter method.
281
+ * @param {boolean} [options.setter=false] - Indicates whether this is a setter method.
282
+ * @param {number} [options.times=Infinity] - The maximum number of times the mock method can be called.
283
+ * @returns {ProxyConstructor} The mock method tracker.
284
+ */
219
285
getter(
220
286
object,
221
287
methodName,
@@ -244,6 +310,18 @@ class MockTracker {
244
310
});
245
311
}
246
312
313
+ /**
314
+ * Mocks a setter method of an object.
315
+ * This function is a syntax sugar for MockTracker.method with options.setter set to true.
316
+ * @param {object} object - The target object.
317
+ * @param {string} methodName - The setter method to be mocked.
318
+ * @param {Function} [implementation] - An optional replacement function for the targeted method.
319
+ * @param {object} [options] - Additional tracking options.
320
+ * @param {boolean} [options.getter=false] - Indicates whether this is a getter method.
321
+ * @param {boolean} [options.setter=true] - Indicates whether this is a setter method.
322
+ * @param {number} [options.times=Infinity] - The maximum number of times the mock method can be called.
323
+ * @returns {ProxyConstructor} The mock method tracker.
324
+ */
247
325
setter(
248
326
object,
249
327
methodName,
@@ -272,12 +350,18 @@ class MockTracker {
272
350
});
273
351
}
274
352
353
+ /**
354
+ * Resets the mock tracker, restoring all mocks and clearing timers.
355
+ */
275
356
reset() {
276
357
this.restoreAll();
277
358
this.#timers?.reset();
278
359
this.#mocks = [];
279
360
}
280
361
362
+ /**
363
+ * Restore all mocks created by this MockTracker instance.
364
+ */
281
365
restoreAll() {
282
366
for (let i = 0; i < this.#mocks.length; i++) {
283
367
FunctionPrototypeCall(restore, this.#mocks[i]);
0 commit comments