【发布时间】:2019-05-14 18:45:27
【问题描述】:
我在 Angular Material 菜单组件上有一个自定义菜单关闭,我想对其进行测试,但它一直失败并输出“TypeError: Cannot read property 'closeMenu' of undefined”
规范文件(底部测试):
@Component({
selector: 'app-test',
template: `
<app-header-menu>
<button [matMenuTriggerFor]="test">Test</button>
<mat-menu #test="matMenu">menu content</mat-menu>
</app-header-menu>
`
})
class TestComponent {}
describe('HeaderMenuComponent', () => {
let component: TestComponent;
let fixture: ComponentFixture<TestComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ TestComponent, HeaderMenuComponent ],
imports: [
MatMenuModule
]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(TestComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it ('should close on click', () => {
document.dispatchEvent(new MouseEvent('click'));
expect(fixture.debugElement.query(By.css('app-header-menu')).nativeElement.trigger.closeMenu()).toHaveBeenCalled();
});
});
组件文件:
export class HeaderMenuComponent {
@ContentChild(MatMenuTrigger) trigger: MatMenuTrigger;
@HostListener('document:click', ['$event'])
onClick = event => {
if (this.trigger && this.trigger.menuOpen && !this.elRef.nativeElement.contains(event.target)) {
this.trigger.closeMenu();
}
}
}
有人知道我做错了什么吗?
【问题讨论】:
-
我认为这里有两个问题。首先,您似乎希望在没有事先监视的情况下调用一个方法,此外您还试图访问本机 HtmlElement 上的组件实例属性。 HtmlElement 上不存在触发器。您应该使用 .componentInstance 访问您的组件,而不是 .nativeElement。但可能还有更多的东西。也许你可以在堆栈闪电战中重现这个问题,而不是我可以更有效地帮助你。
-
这里是 stackblitz 的链接:stackblitz.com/edit/ngx-jasmine-testing-vv7cz8
-
对不起,我有点忙。我不得不创建一个新的 stackblitz,因为你的 stackblitz 中有一些 zone.js 问题。无法异步运行测试。请在此处找到堆栈闪电战stackblitz.com/edit/angular-callback-test
标签: angular unit-testing angular-material