Модульное тестирование углового компонента с помощью Renderer2

#javascript #angular #unit-testing #jasmine

#javascript #angular #модульное тестирование #jasmine

Вопрос:

У меня есть угловой компонент, который выглядит следующим образом:

 constructor(
        @Inject(INJECTION_TOKEN_WINDOW) private window: Window,
        private renderer: Renderer2
){}

ngOnInit() {
  this.renderer.addClass(this.window.document.body, 'myCssClass');
}
  

Фрагмент модульного теста:

 const TOKEN_WINDOW = 'Window';

const WindowMock = {
    document: {
        body: {}
    }
};
describe('MyComponent', () => {
let renderer: Renderer2;
let component: MyComponent;
let fixture: ComponentFixture<MyComponent>;

beforeEach(async(() => {
        TestBed.configureTestingModule({
            declarations: [MyComponent],
            schemas: [CUSTOM_ELEMENTS_SCHEMA],
            providers: [
                Renderer2,
                { provide: TOKEN_WINDOW, useValue: WindowMock }
            ]
        }).compileComponents();
    }));

beforeEach(() => {
        fixture = TestBed.createComponent(MyComponent);
        component = fixture.componentInstance;
        el = fixture.debugElement;

        renderer = fixture.componentRef.injector.get<Renderer2>(Renderer2 as Type<Renderer2>);
        spyOn(renderer, 'myCssClass').and.callThrough();
        fixture.detectChanges();
    });
})

//Tests here...
  

При запуске тестов я получаю ошибку ниже (для любого теста я получаю ту же ошибку, что и ниже). Я предполагаю, что что-то не так с конфигурацией Renderer2 в моем тесте?
Пожалуйста, помогите

 TypeError: Cannot read property 'add' of undefined
    at <Jasmine>
    at DefaultDomRenderer2.push../node_modules/@angular/platform-browser/fesm5/platform-browser.js.DefaultDomRenderer2.addClass (http://localhost:9876/_karma_webpack_/node_modules/@angular/platform-browser/fesm5/platform-browser.js:1160:67)
    at DebugRenderer2.push../node_modules/@angular/core/fesm5/core.js.DebugRenderer2.addClass (http://localhost:9876/_karma_webpack_/node_modules/@angular/core/fesm5/core.js:30455:1)
    at <Jasmine>
  

Ответ №1:

Я думаю Renderer2 , что требуется фактическая реализация окна, а не макет, и имитировать фактическое окно до такой степени, что фактическое Renderer2 выполнение может быть громоздким.

Либо имитируйте оба window и Renderer2 до такой степени, что ваш компонент удовлетворен, либо предоставьте фактическое окно и фактическое Renderer2 .