Skip to content

Commit f1be5ae

Browse files
JeanMechethePunderWoman
authored andcommitted
refactor(core): fix MockRenderer in unit tests. (#63936)
This allows us to drop a test only check in the runtime. PR Close #63936
1 parent aeb3e6c commit f1be5ae

File tree

2 files changed

+27
-20
lines changed

2 files changed

+27
-20
lines changed

packages/core/src/render3/component_ref.ts

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -324,14 +324,8 @@ export class ComponentFactory<T> extends AbstractComponentFactory<T> {
324324
);
325325

326326
// ---- element instruction
327-
328-
// TODO(crisbeto): in practice `hostElement` should always be defined, but there are some
329-
// tests where the renderer is mocked out and `undefined` is returned. We should update the
330-
// tests so that this check can be removed.
331-
if (hostElement) {
332-
setupStaticAttributes(hostRenderer, hostElement, hostTNode);
333-
attachPatchData(hostElement, rootLView);
334-
}
327+
setupStaticAttributes(hostRenderer, hostElement, hostTNode);
328+
attachPatchData(hostElement, rootLView);
335329

336330
// TODO(pk): this logic is similar to the instruction code where a node can have directives
337331
createDirectivesInstances(rootTView, rootLView, hostTNode);

packages/core/test/acceptance/renderer_factory_spec.ts

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -209,13 +209,15 @@ describe('renderer factory lifecycle', () => {
209209
})
210210
class AnimComp {}
211211

212-
const rendererFactory = new MockRendererFactory(['setProperty']);
213-
212+
let rendererFactory!: MockRendererFactory;
214213
TestBed.configureTestingModule({
215214
providers: [
216215
{
217216
provide: RendererFactory2,
218-
useValue: rendererFactory,
217+
useFactory: (doc: Document) => {
218+
rendererFactory = new MockRendererFactory(doc, ['setProperty']);
219+
return rendererFactory;
220+
},
219221
deps: [DOCUMENT],
220222
},
221223
],
@@ -245,12 +247,15 @@ describe('renderer factory lifecycle', () => {
245247
visible = true;
246248
}
247249

248-
const rendererFactory = new MockRendererFactory(['destroy', 'createElement']);
250+
let rendererFactory!: MockRendererFactory;
249251
TestBed.configureTestingModule({
250252
providers: [
251253
{
252254
provide: RendererFactory2,
253-
useValue: rendererFactory,
255+
useFactory: (doc: Document) => {
256+
rendererFactory = new MockRendererFactory(doc, ['destroy', 'createElement']);
257+
return rendererFactory;
258+
},
254259
deps: [DOCUMENT],
255260
},
256261
],
@@ -545,12 +550,15 @@ export class MockRendererFactory implements RendererFactory2 {
545550
lastRenderer: any;
546551
private _spyOnMethods: string[];
547552

548-
constructor(spyOnMethods?: string[]) {
553+
constructor(
554+
private document: Document,
555+
spyOnMethods?: string[],
556+
) {
549557
this._spyOnMethods = spyOnMethods || [];
550558
}
551559

552560
createRenderer(hostElement: RElement | null, rendererType: RendererType2 | null): Renderer2 {
553-
const renderer = (this.lastRenderer = new MockRenderer(this._spyOnMethods));
561+
const renderer = (this.lastRenderer = new MockRenderer(this._spyOnMethods, this.document));
554562
return renderer;
555563
}
556564
}
@@ -561,21 +569,26 @@ class MockRenderer implements Renderer2 {
561569

562570
destroyNode: ((node: any) => void) | null = null;
563571

564-
constructor(spyOnMethods: string[]) {
572+
constructor(
573+
spyOnMethods: string[],
574+
private document: Document,
575+
) {
565576
spyOnMethods.forEach((methodName) => {
566577
this.spies[methodName] = spyOn(this as any, methodName).and.callThrough();
567578
});
568579
}
569580

570581
destroy(): void {}
571582
createComment(value: string): Comment {
572-
return document.createComment(value);
583+
return this.document.createComment(value);
573584
}
574585
createElement(name: string, namespace?: string | null): Element {
575-
return namespace ? document.createElementNS(namespace, name) : document.createElement(name);
586+
return namespace
587+
? this.document.createElementNS(namespace, name)
588+
: this.document.createElement(name);
576589
}
577590
createText(value: string): Text {
578-
return document.createTextNode(value);
591+
return this.document.createTextNode(value);
579592
}
580593
appendChild(parent: RElement, newChild: Node): void {
581594
parent.appendChild(newChild);
@@ -588,7 +601,7 @@ class MockRenderer implements Renderer2 {
588601
}
589602
selectRootElement(selectorOrNode: string | any): RElement {
590603
return typeof selectorOrNode === 'string'
591-
? document.querySelector<HTMLElement>(selectorOrNode)!
604+
? this.document.querySelector<HTMLElement>(selectorOrNode)!
592605
: selectorOrNode;
593606
}
594607
parentNode(node: Node): Element | null {

0 commit comments

Comments
 (0)