How do I add svg files via MatIconRegistry in unit tests? How do I add svg files via MatIconRegistry in unit tests? angular angular

How do I add svg files via MatIconRegistry in unit tests?


can just do:

...import { MatIcon } from '@angular/material/icon';import { MatIconTestingModule } from '@angular/material/icon/testing';describe('MyComponent', () => {  ...  beforeEach(async(() => {    TestBed.configureTestingModule({      declarations: [MyComponent, MatIcon],      imports: [MatIconTestingModule],    }).compileComponents();  }));...});

This will generate a test icon rendering without the http request


Mock the mat-icon selector with the following component at the top of the unit test

@Component({    selector: 'mat-icon',    template: '<span></span>'})class MockMatIconComponent {    @Input() svgIcon: any;    @Input() fontSet: any;    @Input() fontIcon: any;}

Then override the MatIconModule in the unit test as follows

beforeEach(() => {    TestBed.configureTestingModule({        declarations: [ ...],        providers: [ ...  ],        imports: [ MatIconModule, NoopAnimationsModule ]    })    .overrideModule(MatIconModule, {    remove: {       declarations: [MatIcon],       exports: [MatIcon]    },    add: {        declarations: [MockMatIconComponent],        exports: [MockMatIconComponent]   }   })  .compileComponents();

You will no longer have the 'Error retrieving icon: Unable to find icon with the name ":myIcon"' issue when running the unit tests


Just spent a couple hours on this. It looks like Angular now provides a FakeMatIconRegistry. It squashed about 90% of the karma warnings, but still a few remain...

Had to do a lot of this:

TestBed.configureTestingModule({    declarations: [ MyComponent ],    imports: [        ...        MatIconModule,    ],    providers: [        ...        { provide: MatIconRegistry, useClass: FakeMatIconRegistry }    ]}).compileComponents();