#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
.