Skip to content

Commit 429ad31

Browse files
fix(root): ignore signal-based queries
closes #8634
1 parent 5c98e73 commit 429ad31

File tree

3 files changed

+57
-4
lines changed

3 files changed

+57
-4
lines changed

libs/ng-mocks/src/lib/common/decorate.queries.ts

+6-3
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,13 @@ const generateFinalQueries = (queries: {
2626
const scanKeys: string[] = [];
2727

2828
for (const key of Object.keys(queries)) {
29-
const query: Query & { ngMetadataName?: string } = queries[key];
30-
final.push([key, query]);
29+
const query: Query & { ngMetadataName?: string; isSignal?: boolean } = queries[key];
3130

32-
if (!query.isViewQuery && !isInternalKey(key)) {
31+
if (!query.isSignal) {
32+
final.push([key, query]);
33+
}
34+
35+
if (!query.isViewQuery && !query.isSignal && !isInternalKey(key)) {
3336
scanKeys.push(key);
3437
final.push([`__ngMocksVcr_${key}`, cloneVcrQuery(query)]);
3538
}

libs/ng-mocks/src/lib/mock-component/render/generate-template.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,13 @@ export default (queries?: Record<keyof any, any>): string => {
2727
}
2828

2929
for (const key of Object.keys(queries)) {
30-
const query: Query = queries[key];
30+
const query: Query & { isSignal?: boolean } = queries[key];
3131
if (!isTemplateRefQuery(query)) {
3232
continue;
3333
}
34+
if (query.isSignal) {
35+
continue;
36+
}
3437
if (typeof query.selector === 'string') {
3538
const selector = query.selector.replace(new RegExp('\\W', 'mg'), '_');
3639
queries[`__mockView_key_${selector}`] = new ViewChild(`key_${selector}`, viewChildArgs);

tests-e2e/src/issue-8634/test.spec.ts

+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import {
2+
Component,
3+
ElementRef,
4+
Input,
5+
contentChild,
6+
input,
7+
viewChild,
8+
} from '@angular/core';
9+
import { MockBuilder, MockRender } from 'ng-mocks';
10+
11+
@Component({
12+
selector: 'app-nested',
13+
standalone: true,
14+
template: `<div #meow>Nested content</div>`,
15+
})
16+
class NestedComponent {
17+
public readonly meowV = viewChild<ElementRef>('meow');
18+
public readonly meowC = contentChild<ElementRef>('meow');
19+
20+
public readonly name = input.required<string>();
21+
}
22+
23+
@Component({
24+
selector: 'app-target',
25+
standalone: true,
26+
imports: [NestedComponent],
27+
template: `
28+
<app-nested></app-nested>
29+
<div>name: {{ name }}</div>
30+
`,
31+
})
32+
class TargetComponent {
33+
@Input() public readonly name: string = '';
34+
}
35+
36+
describe('my sandbox', () => {
37+
beforeEach(() => MockBuilder(TargetComponent));
38+
39+
it('should do something', () => {
40+
const fixture = MockRender(TargetComponent, {
41+
name: 'sandbox',
42+
});
43+
expect(fixture.nativeElement.innerHTML).toContain(
44+
'name: sandbox',
45+
);
46+
});
47+
});

0 commit comments

Comments
 (0)