Как исправить Нет провайдера для ChangeDetectorRef! в тестировании кармы-жасмина

StaticInjectorError(DynamicTestModule)[MatTable -> ChangeDetectorRef]: StaticInjectorError(Platform: core)[MatTable -> ChangeDetectorRef]: NullInjectorError: No provider for ChangeDetectorRef!

import { async, ComponentFixture, TestBed } from '@angular/core/testing';

import { MessagesComponent } from './messages.component';
import { NgModule,CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA} from '@angular/core';
import { MatTableModule } from '../../../MessageUtility/node_modules/@angular/material';
import { HttpClientModule } from '@angular/common/http';
import { RouterTestingModule  } from '@angular/router/testing';

describe('MessagesComponent', () => {
  let component: MessagesComponent;
  let fixture: ComponentFixture<MessagesComponent>;

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [ MessagesComponent ],
    imports:[HttpClientModule,RouterTestingModule,MatTableModule, ],
      schemas: [NO_ERRORS_SCHEMA,NO_ERRORS_SCHEMA]
    })
    .compileComponents();
  }));

  beforeEach(() => {
    fixture = TestBed.createComponent(MessagesComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  });

  it('should create', () => {
    expect(component).toBeTruthy();
  });
});

Можете ли вы добавить код

Chellappan வ 29.01.2019 04:55
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
1
2 143
2

Ответы 2

Используете ли вы ChangeDetectionStrategy.OnPush в качестве стратегии обнаружения изменений? ChangeDetectorRef фактически предоставляется фикстуре, как объяснено здесь.

Если вы определили ChangeDetectorRef как один из ваших личных атрибутов в вашем компоненте следующим образом:

constructor(private cdr: ChangeDetectorRef) { }

Поскольку он является частным, вы должны создать шпион в качестве заглушки для этого атрибута в своем тестовом файле и проверить, вызывается ли ChangeDetectorRef. Просто смоделируйте CDR в вашем файле .spec, выполнив следующие действия:

it('test CDR', () => {
  const spyCDR = spyOn((component as any).cdr, 'detectChanges'); 

  component.method();    
  expect(spyCDR).toHaveBeenCalled();
});

Другой подход заключается в предоставлении всех необходимых методов ChangeDetectorRef как части вашей декларации TestBed.configureTestingModule.

Например, если ваш код (или третья библиотека, как в вашем случае) использует метод detectChanges экземпляра ChangeDetectorRef, вы можете предоставить его, как в следующем примере:

    beforeEach(() => {
        TestBed.configureTestingModule({
            providers: [
                // other providers here
                { provide: ChangeDetectorRef, useValue: { detectChanges: () => { } } }
            ]
        });
    });

Другие вопросы по теме