gpt4 book ai didi

具有第三方指令的 Angular2 Jasmine 单元测试组件

转载 作者:太空狗 更新时间:2023-10-29 17:50:08 26 4
gpt4 key购买 nike

组件是 https://github.com/valor-software/ngx-bootstrap下拉菜单。

在模板中我有这个:

    <span dropdown placement="bottom right">
<a id="droplist-label" href="javascript:void(0)" dropdownToggle>
<span>{{conf.title}}</span>
</a>
<ul class="dropdown-menu pull-right" *dropdownMenu>
<li *ngFor="let item of items">
<a class="dropdown-item" (click)="listClick(item.value)" href="javascript:void(0)">{{item.label}}</a>
</li>
</ul>
</span>

在单击标签之前不会添加 ul - 因此我无法在测试中访问它。

调用点击:

let droplist = fixture.debugElement.query(By.css('#droplist-label')).nativeElement;
droplist.click();

不起作用 - 如果我尝试寻找 dropdown-menu 它是空的:

it('should test if droplist has title',  async(() => {
fixture.detectChanges();
let droplist = fixture.debugElement.query(By.css('#droplist-label')).nativeElement;
droplist.click();

fixture.whenStable().then(() => {
let droplistOptions = fixture.debugElement.queryAll(By.css('.dropdown-item'));
expect(droplistOptions.length).toBeGreaterThan(0);
});
}));

该指令似乎有一个用于点击事件的主机监听器 - 我如何触发它以便 ul 变得可用?

最佳答案

我终于用 fakeAsync() 解决了同一个 pb :

it('should render submenus', fakeAsync(() => {

fixture.detectChanges(); // update the view

// trig submenus opening
let toggleButtons = fixture.debugElement.nativeElement.querySelectorAll('[dropdownToggle]');
toggleButtons.forEach(b => b.click());


tick(); // wait for async tasks to end
fixture.detectChanges(); // update the view

// then count how many items you got for each submenus.
let droplistOptions1= fixture.debugElement.nativeElement.querySelectorAll('#first-ul > li')
let droplistOptions2= fixture.debugElement.nativeElement.querySelectorAll('#second-ul > li')
let droplistOptions3= fixture.debugElement.nativeElement.querySelectorAll('#third-ul > li')
expect(droplistOptions1.length).toEqual(3);
expect(droplistOptions2.length).toEqual(5);
expect(droplistOptions3.length).toEqual(2);
}));

但我确信可以使用 async() 来做到这一点:我猜你只是错过了 fixture.detectChanges()fixture.whenStable().then(...) 在您的初始尝试中。


此外,请记住将 BsDropdownModule 导入到您的测试平台中:

import { BsDropdownModule} from 'ngx-bootstrap/dropdown';
...
TestBed.configureTestingModule({
imports: [
BsDropdownModule.forRoot(),
],
...
});

关于具有第三方指令的 Angular2 Jasmine 单元测试组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43319467/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com