Using signals in render template should automatically apply to component
The closest I'm seeing is this example, but it has some issues:
https://github.com/testing-library/angular-testing-library/blob/main/apps/example-app/src/app/examples/22-signal-inputs.component.spec.ts
- Only
modelcan be updated, which would require us to change our components frominputfor anything we want to test, which is not ideal - Manually interacting with the underlying values like that is testing implementation details
- The template syntax in
renderdoesn't expose an underlying componentRef to callsetInputon
In an ideal world, the template will automatically update when the signal changes, like we'd expect in angular template HTML:
Preferred API:
it("should render text from a signal", async () => {
const someSignal = signal("hello");
await render(
html`<span data-testid="value">{{ someSignal() }} world</span>`,
{
componentProperties: {
someSignal,
},
},
);
// Passes
expect(screen.getByTestId("value")).toHaveTextContent("hello world");
someSignal.set("updated");
// Fails
expect(screen.getByTestId("value")).toHaveTextContent("updated world");
});
Hello, sorry I missed the notification for this issue.
I agree that would be nice to do, unfortunately Angular's setInput API doesn't work nicely with Signals.
Because of this, it doesn't work for ATL and I don't think it's a good idea to patch this behavior on our side.
For now, you should be able to work around it by accessing the signal through the test fixture.
https://github.com/testing-library/angular-testing-library/blob/main/apps/example-app/src/app/examples/22-signal-inputs.component.spec.ts#L45
This should be fixed by #547