Я использую угловой 5.2.0. У меня есть дочерний компонент
import { Component } from '@angular/core';
@Component({
template: `<div><\div>`
})
export class ChildComponent {
public childMethod() {
...
}
}
и родительский компонент, который обращается к дочернему через ViewChild
import { Component, ViewChild } from '@angular/core';
import { ChildComponent } from 'child.component';
@Component({
template: `<child-component #child><\child-component>`
})
export class ParentComponent {
@ViewChild('child')
public child: ChildComponent;
public parentMethod() {
this.child.childMethod();
}
}
Мне нужен модульный тест, доказывающий, что вызов parentMethod
вызывает вызов childMethod
. У меня есть следующее:
import { NO_ERRORS_SCHEMA } from '@angular/core';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { ChildComponent } from './child.component';
import { ParentComponent } from './parent.component';
describe('ParentComponent', () => {
let component: Parentcomponent;
let fixture: ComponentFixture<Parentcomponent>;
beforeEach(() => {
TestBed.configureTestingModule({
declarations: [ ParentComponent, ChildComponent ],
schemas: [ NO_ERRORS_SCHEMA ]
}).compileComponents();
});
beforeEach(() => {
fixture = TestBed.createComponent(TaskListPaginatorComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should invoke childMethod when parentMethod is invoked', () => {
const childMethodSpy: jasmine.Spy = spyOn(component.child, 'childMethod');
component.parentMethod();
expect(childMethodSpy).toHaveBeenCalled();
});
});
Однако это не работает, и я получаю Error: <spyOn> : could not find an object to spy upon for childMethod()
.
Более того, это не юнит-тест, потому что вместо мока я использую настоящий ChildComponent. Я попытался создать MockChildComponent и добавить его в declarations
и export
, но получил тот же результат. Любая помощь?
Я знаю, что есть похожие посты, но они для разных версий angular, и они не помогли.
ChildComponent
- лучшее решение. - person Kim Kern   schedule 25.07.2018