Search code examples
angularangular-test

unit testing angular component with input.required


When my components are like this

export OldComponent {
    @input myInput!: string;
}

I can prepare the unit tests like this:

fixture = TestBed.createComponent(OldComponent);
component = fixture.componentInstance;
component.myInput = 'test';
fixture.detectChanges();

Now that we have input signals (Angular 17)

export NewComponent {
    myInput = input.required<string>();
}

How do we prepare the component for testing? This doesn't compille because an input signal is read-only:

fixture = TestBed.createComponent(NewComponent);
component = fixture.componentInstance;
component.myInput.set('test'); // Does not compile
fixture.detectChanges();

I tried not assigning it for the tests, but obviously it throws: Error: NG0950: Input is required but no value is available yet. Find more at https://angular.io/errors/NG0950

I would not like to use the workaround of using a normal, not required input: input<string>('default value')


Solution

  • To set inputs, you can use ComponentRef<T>.setInput method, which also works with signals:

    fixture = TestBed.createComponent(NewComponent);
    component = fixture.componentInstance;
    fixture.componentRef.setInput('required', 'test');
    fixture.detectChanges();