@nestjs/testing 12.1.3 → 12.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +3 -2
- package/testing-injector.d.ts +2 -0
- package/testing-injector.js +25 -6
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nestjs/testing",
|
|
3
|
-
"version": "12.
|
|
3
|
+
"version": "12.2.0",
|
|
4
4
|
"description": "Nest - modern, fast, powerful node.js web framework (@testing)",
|
|
5
5
|
"author": "Kamil Mysliwiec",
|
|
6
6
|
"license": "MIT",
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
"main": "./index.js",
|
|
9
9
|
"exports": {
|
|
10
10
|
".": "./index.js",
|
|
11
|
+
"./package.json": "./package.json",
|
|
11
12
|
"./*.js": "./*.js",
|
|
12
13
|
"./*": "./*.js"
|
|
13
14
|
},
|
|
@@ -41,5 +42,5 @@
|
|
|
41
42
|
"optional": true
|
|
42
43
|
}
|
|
43
44
|
},
|
|
44
|
-
"gitHead": "
|
|
45
|
+
"gitHead": "af37111368de7fd2dfab0bdec2f530c7845510c2"
|
|
45
46
|
}
|
package/testing-injector.d.ts
CHANGED
|
@@ -13,8 +13,10 @@ interface ResolutionContext {
|
|
|
13
13
|
export declare class TestingInjector extends Injector {
|
|
14
14
|
protected mocker?: MockFactory;
|
|
15
15
|
protected container: NestContainer;
|
|
16
|
+
private readonly mockedInstances;
|
|
16
17
|
setMocker(mocker: MockFactory): void;
|
|
17
18
|
setContainer(container: NestContainer): void;
|
|
19
|
+
protected lookupSkippedProviderDependencies(wrapper: InstanceWrapper, moduleRef: Module): Promise<void>;
|
|
18
20
|
resolveComponentWrapper<T>(moduleRef: Module, name: any, dependencyContext: InjectorDependencyContext, wrapper: InstanceWrapper<T>, resolutionContext?: ResolutionContext, keyOrIndex?: string | number): Promise<InstanceWrapper>;
|
|
19
21
|
resolveComponentHost<T>(moduleRef: Module, instanceWrapper: InstanceWrapper<T>, resolutionContext?: ResolutionContext): Promise<InstanceWrapper>;
|
|
20
22
|
private mockWrapper;
|
package/testing-injector.js
CHANGED
|
@@ -5,19 +5,31 @@ import { STATIC_CONTEXT, Injector, InstanceWrapper, } from '@nestjs/core/interna
|
|
|
5
5
|
export class TestingInjector extends Injector {
|
|
6
6
|
mocker;
|
|
7
7
|
container;
|
|
8
|
+
mockedInstances = new Map();
|
|
8
9
|
setMocker(mocker) {
|
|
9
10
|
this.mocker = mocker;
|
|
11
|
+
this.mockedInstances.clear();
|
|
10
12
|
}
|
|
11
13
|
setContainer(container) {
|
|
12
14
|
this.container = container;
|
|
13
15
|
}
|
|
16
|
+
// Request-scoped and transient providers are not loaded at compile time,
|
|
17
|
+
// and the injector that resolves them later has no mocker. Their
|
|
18
|
+
// dependencies are still looked up here, through resolveComponentWrapper(),
|
|
19
|
+
// which mocks the missing ones without creating any instance.
|
|
20
|
+
async lookupSkippedProviderDependencies(wrapper, moduleRef) {
|
|
21
|
+
const lookup = super.lookupSkippedProviderDependencies(wrapper, moduleRef);
|
|
22
|
+
// With a mocker, a dependency that cannot be mocked fails later, at
|
|
23
|
+
// resolve time.
|
|
24
|
+
return this.mocker ? lookup.catch(() => undefined) : lookup;
|
|
25
|
+
}
|
|
14
26
|
async resolveComponentWrapper(moduleRef, name, dependencyContext, wrapper, resolutionContext = { contextId: STATIC_CONTEXT }, keyOrIndex) {
|
|
15
27
|
try {
|
|
16
28
|
const existingProviderWrapper = await super.resolveComponentWrapper(moduleRef, name, dependencyContext, wrapper, resolutionContext, keyOrIndex);
|
|
17
29
|
return existingProviderWrapper;
|
|
18
30
|
}
|
|
19
31
|
catch (err) {
|
|
20
|
-
return this.mockWrapper(err, moduleRef, name, wrapper);
|
|
32
|
+
return this.mockWrapper(err, moduleRef, name, name, wrapper);
|
|
21
33
|
}
|
|
22
34
|
}
|
|
23
35
|
async resolveComponentHost(moduleRef, instanceWrapper, resolutionContext = { contextId: STATIC_CONTEXT }) {
|
|
@@ -26,21 +38,28 @@ export class TestingInjector extends Injector {
|
|
|
26
38
|
return existingProviderWrapper;
|
|
27
39
|
}
|
|
28
40
|
catch (err) {
|
|
29
|
-
return this.mockWrapper(err, moduleRef, instanceWrapper.name, instanceWrapper);
|
|
41
|
+
return this.mockWrapper(err, moduleRef, instanceWrapper.name, instanceWrapper.token, instanceWrapper);
|
|
30
42
|
}
|
|
31
43
|
}
|
|
32
|
-
async mockWrapper(err, moduleRef, name, wrapper) {
|
|
44
|
+
async mockWrapper(err, moduleRef, name, token, wrapper) {
|
|
33
45
|
if (!this.mocker) {
|
|
34
46
|
throw err;
|
|
35
47
|
}
|
|
36
|
-
|
|
48
|
+
// Every provider that depends on the token must get the same mock,
|
|
49
|
+
// the one `get()` returns.
|
|
50
|
+
let mockedInstance = this.mockedInstances.get(token);
|
|
37
51
|
if (!mockedInstance) {
|
|
38
|
-
|
|
52
|
+
mockedInstance = this.mocker(name);
|
|
53
|
+
if (!mockedInstance) {
|
|
54
|
+
throw err;
|
|
55
|
+
}
|
|
56
|
+
this.mockedInstances.set(token, mockedInstance);
|
|
39
57
|
}
|
|
58
|
+
// The mock is a single value, so it stays static whatever the scope of
|
|
59
|
+
// the provider it replaces or the provider that depends on it.
|
|
40
60
|
const newWrapper = new InstanceWrapper({
|
|
41
61
|
name,
|
|
42
62
|
isAlias: false,
|
|
43
|
-
scope: wrapper.scope,
|
|
44
63
|
instance: mockedInstance,
|
|
45
64
|
isResolved: true,
|
|
46
65
|
host: moduleRef,
|