unit-testing - MutationObserver 上的 Angular 指令单元测试失败:参数 1 不是“节点”类型
问题描述
我正在为其中包含 MutationObserver 的指令设置一些单元测试,并在每次更改时发出一个事件(随着活动的 routerLink 更改)。它适用于 Angular 的 ElementRef API。
我遵循了官方文档和这个很好的解释:https ://stackoverflow.com/a/37680484/6454752并且实际上可以在测试中获取带有指令的元素:
describe('ActiveLinkChangeDirective', () => {
let component: TestMatExpansionPanelComponent
let fixture: ComponentFixture<TestMatExpansionPanelComponent>;
let link
let observed
beforeEach(fakeAsync(() => {
TestBed.configureTestingModule({
imports: [RouterTestingModule],
declarations: [ActiveLinkChangeDirective,
TestMatExpansionPanelComponent],
providers: [
{ provide: ElementRef, useClass: TestMatExpansionPanelComponent }],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
}).compileComponents().then(() => {
fixture = TestBed.createComponent(TestMatExpansionPanelComponent)
component = fixture.debugElement
link = fixture.debugElement.query(By.directive(ActiveLinkChangeDirective))
expect(link).not.toBeNull()
observed = link.injector.get(ActiveLinkChangeDirective)
expect(observed).not.toBeNull()
let observer = new MutationObserver((mutations) => {
mutations.forEach(mutation => console.log(mutation.target))
})
observer.observe(observed, { attributes: true })
fixture.detectChanges();
})
}))
但是,它失败并出现以下错误Failed to execute 'observe' on 'MutationObserver': parameter 1 is not of type 'Node'.
:
it('should create an instance', () => {
let directive = new ActiveLinkChangeDirective(component)
expect(directive).toBeTruthy()
});
据我了解,这个错误意味着 MutationObserver 只是没有要观察的元素,而不是专门指观察到的元素类型。我只是无法将观察到的元素的实例传递给测试中的 MutationObserver。任何建议都受到高度赞赏。
解决方案
通过像这样包装方法,我能够使测试通过observer.observe
:
let addObserver = () => {
if (!observed) {
tick(500)
addObserver
return
}
observer.observe(observed, { attributes: true })
}
显然,该方法在异步测试中被调用得太早了。
推荐阅读
- python - 如何通过嵌套列表的值和条件为 reverse=True 的嵌套列表的第一个值对列表的 python 列表进行排序?
- c++ - 在命名空间中使用全局命名空间中的函数
- rust - 如何惯用地检查二维向量是否为表格?
- file - 在 UNIX 中使用触摸创建目录和创建文件时出错
- google-bigquery - 覆盖多个分区 bigquery
- java - Spring Boot + ReactiveCosmosRepository + java.lang.NoSuchMethodError: reactor.util.concurrent.Queues.empty()Ljava/util/function/Supplier
- javascript - Express handlerbars node js问题
- python-3.x - 如何在 Ubuntu 16.04 上将 FTS5 扩展与带有 Python 3.7 的 sqlite3 python 模块一起使用?
- swift - Xcode 内存不足
- java - 如何将现有列表更改为新列表?|| android - firebase 实时数据库