angular-testing-library icon indicating copy to clipboard operation
angular-testing-library copied to clipboard

Support `on` with `render` that receive an template

Open timdeschryver opened this issue 1 year ago • 3 comments

Using on should also work with template renders.

https://github.com/testing-library/angular-testing-library/blob/ef521727d9a5a60a998e2ef5f5406400be2a9a0c/apps/example-app/src/app/examples/02-input-output.spec.ts#L35C1-L60C4

@mumenthalers do you have an idea how this can work?

timdeschryver avatar Jul 23 '24 16:07 timdeschryver

this issue is also present when using inputs not only outputs @timdeschryver

edgargonzalez525 avatar Sep 03 '24 17:09 edgargonzalez525

When providing a template rather than a component type, the WrapperComponent is used with it's template part overwritten.

@timdeschryver I don't think it would be useful to support on and inputs for templates. The main task for them is to subscribe to existing observables , and to provide values to existing inputs while providing supportive types.

I'd propose to only work with componentProperties when using a template as this already works perfectly for this case . Maybe the signature could be changed accordingly (to only support componentProperties when providing a template) afaik there is no other way to achieve this binding than to write component properties of the WrapperComponent.

--> imo the componentProperties should definitely not be deprecated

  it('template test', async () => {
    @Component({standalone: true, template:`<button (click)="event.emit()">{{value()}}</button>`, selector: 'app-test'})
    class AppTestComponent {
      readonly value = input.required<string>()
      readonly event = output<void>()
    }
    const value = 'foo bar'
    const fn = jest.fn()
    const result = await render(
      '<app-test [value]="value" (event)="fn($event)"/>',
      {
        imports: [AppTestComponent],
        componentProperties: { value, fn }
      }
    )
    const button = result.getByRole('button')
    expect(button).toHaveTextContent(value)
    button.click()
    expect(fn).toHaveBeenCalled()
  })

mumenthalers avatar Sep 04 '24 11:09 mumenthalers

@mumenthalers that's a valid point, and something I was also thinking. This is something we can do for the next major release. Thanks for your input, it's appreciated!

timdeschryver avatar Sep 04 '24 18:09 timdeschryver