Skip to content

Commit 4c5a255

Browse files
feat: support detectChangesOnRender within rerender
ref testing-library#365
1 parent 66ba0c7 commit 4c5a255

File tree

3 files changed

+48
-3
lines changed

3 files changed

+48
-3
lines changed

projects/testing-library/src/lib/models.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ export interface RenderResult<ComponentType, WrapperType = ComponentType> extend
6060
rerender: (
6161
properties?: Pick<
6262
RenderTemplateOptions<ComponentType>,
63-
'componentProperties' | 'componentInputs' | 'componentOutputs'
63+
'componentProperties' | 'componentInputs' | 'componentOutputs' | 'detectChangesOnRender'
6464
>,
6565
) => Promise<void>;
6666
/**

projects/testing-library/src/lib/testing-library.ts

+10-2
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,10 @@ export async function render<SutType, WrapperType = SutType>(
127127
let renderedInputKeys = Object.keys(componentInputs);
128128
let renderedOutputKeys = Object.keys(componentOutputs);
129129
const rerender = async (
130-
properties?: Pick<RenderTemplateOptions<SutType>, 'componentProperties' | 'componentInputs' | 'componentOutputs'>,
130+
properties?: Pick<
131+
RenderTemplateOptions<SutType>,
132+
'componentProperties' | 'componentInputs' | 'componentOutputs' | 'detectChangesOnRender'
133+
>,
131134
) => {
132135
const newComponentInputs = properties?.componentInputs ?? {};
133136
for (const inputKey of renderedInputKeys) {
@@ -154,7 +157,12 @@ export async function render<SutType, WrapperType = SutType>(
154157
}
155158
renderedPropKeys = Object.keys(newComponentProps);
156159

157-
fixture.componentRef.injector.get(ChangeDetectorRef).detectChanges();
160+
if (
161+
properties?.detectChangesOnRender === true ||
162+
(properties?.detectChangesOnRender === undefined && detectChangesOnRender === true)
163+
) {
164+
fixture.componentRef.injector.get(ChangeDetectorRef).detectChanges();
165+
}
158166
};
159167

160168
const changeInput = (changedInputProperties: Partial<SutType>) => {

projects/testing-library/tests/rerender.spec.ts

+37
Original file line numberDiff line numberDiff line change
@@ -81,3 +81,40 @@ test('rerenders the component with updated props and resets other props', async
8181
},
8282
});
8383
});
84+
85+
describe('detectChangesOnRender', () => {
86+
test('change detection gets not called if disabled within render', async () => {
87+
const { rerender, detectChanges } = await render(FixtureComponent, { detectChangesOnRender: false });
88+
detectChanges();
89+
expect(screen.getByText('Sarah')).toBeInTheDocument();
90+
91+
const firstName = 'Mark';
92+
await rerender({ componentInputs: { firstName } });
93+
94+
expect(screen.getByText('Sarah')).toBeInTheDocument();
95+
expect(screen.queryByText(firstName)).not.toBeInTheDocument();
96+
});
97+
98+
test('change detection gets called if disabled within render but enabled within rerender', async () => {
99+
const { rerender, detectChanges } = await render(FixtureComponent, { detectChangesOnRender: false });
100+
detectChanges();
101+
expect(screen.getByText('Sarah')).toBeInTheDocument();
102+
103+
const firstName = 'Mark';
104+
await rerender({ componentInputs: { firstName }, detectChangesOnRender: true });
105+
106+
expect(screen.getByText(firstName)).toBeInTheDocument();
107+
expect(screen.queryByText('Sarah')).not.toBeInTheDocument();
108+
});
109+
110+
test('change detection gets not called if disabled within rerender', async () => {
111+
const { rerender } = await render(FixtureComponent);
112+
expect(screen.getByText('Sarah')).toBeInTheDocument();
113+
114+
const firstName = 'Mark';
115+
await rerender({ componentInputs: { firstName }, detectChangesOnRender: false });
116+
117+
expect(screen.getByText('Sarah')).toBeInTheDocument();
118+
expect(screen.queryByText(firstName)).not.toBeInTheDocument();
119+
});
120+
});

0 commit comments

Comments
 (0)