Skip to content

Commit 3450e1d

Browse files
committed
fix(ngMocks.stubMember): forwarding stub values to point.componentInstance #1165
1 parent 866c941 commit 3450e1d

File tree

3 files changed

+72
-6
lines changed

3 files changed

+72
-6
lines changed

libs/ng-mocks/src/lib/mock-helper/mock-helper.stub-member.ts

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,18 @@
1-
export default <T extends object>(instance: T, key: any, value: any, encapsulation?: 'get' | 'set'): any => {
2-
const def = Object.getOwnPropertyDescriptor(instance, key) || {};
1+
import helperExtractPropertyDescriptor from '../mock-service/helper.extract-property-descriptor';
2+
3+
export default <T extends object>(
4+
instance: T & { __ngMocks__source?: object },
5+
key: any,
6+
value: any,
7+
encapsulation?: 'get' | 'set',
8+
): any => {
9+
const def = helperExtractPropertyDescriptor(instance, key) ?? {};
10+
11+
if (!encapsulation && def.set && (def.set as any).__ngMocksProxy) {
12+
def.set(value);
13+
14+
return value;
15+
}
316

417
const descriptor: PropertyDescriptor = {
518
configurable: true,

libs/ng-mocks/src/lib/mock-render/func.install-prop-reader.ts

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ import coreDefineProperty from '../common/core.define-property';
22
import helperDefinePropertyDescriptor from '../mock-service/helper.define-property-descriptor';
33
import helperMockService from '../mock-service/helper.mock-service';
44

5-
const createPropertyGet =
6-
(key: keyof any & string, reader: Record<keyof any, any>, source: Record<keyof any, any>) => () => {
5+
const createPropertyGet = (key: keyof any & string, reader: Record<keyof any, any>, source: Record<keyof any, any>) => {
6+
const handler = () => {
77
if (typeof source[key] === 'function') {
88
if (reader[`__ngMocks_${key}__origin`] !== source[key]) {
99
const clone = helperMockService.createClone(source[key], reader, source);
@@ -16,9 +16,13 @@ const createPropertyGet =
1616

1717
return source[key];
1818
};
19+
coreDefineProperty(handler, '__ngMocksProxy', true, false);
1920

20-
const createPropertySet =
21-
(key: keyof any & string, reader: Record<keyof any, any>, source: Record<keyof any, any>) => (newValue: any) => {
21+
return handler;
22+
};
23+
24+
const createPropertySet = (key: keyof any & string, reader: Record<keyof any, any>, source: Record<keyof any, any>) => {
25+
const handler = (newValue: any) => {
2226
if (reader[`__ngMocks_${key}`]) {
2327
reader[`__ngMocks_${key}`] = undefined;
2428
}
@@ -27,6 +31,10 @@ const createPropertySet =
2731
}
2832
source[key] = newValue;
2933
};
34+
coreDefineProperty(handler, '__ngMocksProxy', true, false);
35+
36+
return handler;
37+
};
3038

3139
const extractAllKeys = (instance: object) => [
3240
...helperMockService.extractPropertiesFromPrototype(Object.getPrototypeOf(instance)),
@@ -45,6 +53,7 @@ export default (
4553
if (!source) {
4654
return;
4755
}
56+
coreDefineProperty(reader, '__ngMocks__source', source, false);
4857
const exists = extractOwnKeys(reader);
4958
const fields = [...extractAllKeys(source), ...extra];
5059
for (const key of fields) {

tests/issue-1165/test.spec.ts

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import { Component } from '@angular/core';
2+
import { MockBuilder, MockRender, ngMocks } from 'ng-mocks';
3+
4+
@Component({
5+
selector: 'target',
6+
template: `{{ value }}`,
7+
})
8+
class TargetComponent {
9+
private valueOrigin = 0;
10+
11+
public get value(): number {
12+
return this.valueOrigin;
13+
}
14+
15+
public set value(value: number) {
16+
this.valueOrigin = value;
17+
}
18+
}
19+
20+
// @see https://github.com/ike18t/ng-mocks/issues/1165
21+
describe('issue-1165', () => {
22+
beforeEach(() => MockBuilder(TargetComponent));
23+
24+
it('sets values via proxy', () => {
25+
const fixture = MockRender(TargetComponent);
26+
expect(ngMocks.formatText(fixture)).toEqual('0');
27+
28+
fixture.componentInstance.value = 1;
29+
fixture.detectChanges();
30+
expect(ngMocks.formatText(fixture)).toEqual('1');
31+
32+
fixture.point.componentInstance.value = 2;
33+
fixture.detectChanges();
34+
expect(ngMocks.formatText(fixture)).toEqual('2');
35+
36+
ngMocks.stubMember(fixture.componentInstance, 'value', 3);
37+
fixture.detectChanges();
38+
expect(ngMocks.formatText(fixture)).toEqual('3');
39+
40+
ngMocks.stubMember(fixture.point.componentInstance, 'value', 4);
41+
fixture.detectChanges();
42+
expect(ngMocks.formatText(fixture)).toEqual('4');
43+
});
44+
});

0 commit comments

Comments
 (0)