Angular 单元测试组件 ngIf 元素为空
Angular unit testing component ngIf element is null
我有一个包含一些 *ngIf 语句的组件,其中大部分如下所示
<ul *ngFor="let item of items">
<li>
<ng-container *ngIf="itemCount && item.GroupId == 4">
<span class="bridge">{{itemCount}}</span>
</ng-container>
</li>
... and so on
在我的规范文件中,我有一个测试试图检查 itemCount 不为空/空且 groupId = 4 的情况...然后检查跨度是否包含正确的项目计数。
我已经花了几个小时研究这个的变体,但无论我尝试什么,尝试访问 span 结果都是 null 并且测试失败。
下面是其中一项测试的示例
if('should show the correct item count', () =>{
let component = fixture.componentInstance;
component.itemCount = 4;
fixture.detectChanges();
let bridge = fixture.debugElement.query(By.css('.bridge'));
expect(bridge).tobeTruthy();
});
正如我上面所说,通过多次尝试,无论如何,这总是空的。我调试了测试并确认使用了正确的 groupId 也确认了 itemCount 不是 null 或空所以 *ngIf 的两个条件都应该满足 - 但跨度不存在所以我必须假设有有些不对劲。
请原谅打字错误,我正在手动复制代码,但目前确实如此 运行,只是没有成功。
有什么指点吗?
更新:
这里有更多信息,组件填充了虚拟数据的 beforeEach。
const ItemServiceStub = jasmine.createSpyObj('ItemService', ['getItems']);
beforeEach(() =>{
TestBed.configureTestingModule({
declarations: [ItemComponent],
providers: [{provide: ItemService, useValue: ItemServiceStub}]
}).compileComponents();
});
beforeEach(() => {
itemService = Testbed.inject(ItemService);
spyOn(itemService, 'getItems').and.callFake(() => of(fakeItems));
fixture = TestBed.createComponent(ItemComponent);
fixture.autoDetectChanges();
});
更新 2
这是正在设置的假数据
describe('item tests', () => {
let fakeItems: Item[];
fakeItems = [
{GroupId: '2', ItemName: 'test', isExternal: false},
{GroupId: '3', ItemName: 'testing', isExternal: false},
{GroupId: '4', ItemName: 'test item', isExternal: false}
];
});
试试这个:
it('should show the correct item count', () =>{
let component = fixture.componentInstance;
component.items = [...fakeItems];
component.itemCount = 4;
fixture.detectChanges();
let bridge = fixture.debugElement.query(By.css('.bridge'));
console.log(bridge); // make sure it logs something to the console
expect(bridge).toBeTruthy();
});
如果这不起作用,我认为在 ul
之上有一个 *ngIf
是不正确的,因此不会显示此 ul
。
要对此进行测试,请尝试:
<ul class="dummy-class" *ngFor="let item of items">
<li>
<ng-container *ngIf="itemCount && item.GroupId == 4">
<span class="bridge">{{itemCount}}</span>
</ng-container>
</li>
it('should show the correct item count', () =>{
let component = fixture.componentInstance;
component.items = [...fakeItems];
component.itemCount = 4;
fixture.detectChanges();
let bridge = fixture.debugElement.query(By.css('ul.dummy-class'));
console.log(ul); // make sure it logs something to the console
expect(ul).toBeTruthy();
});
我有一个包含一些 *ngIf 语句的组件,其中大部分如下所示
<ul *ngFor="let item of items">
<li>
<ng-container *ngIf="itemCount && item.GroupId == 4">
<span class="bridge">{{itemCount}}</span>
</ng-container>
</li>
... and so on
在我的规范文件中,我有一个测试试图检查 itemCount 不为空/空且 groupId = 4 的情况...然后检查跨度是否包含正确的项目计数。
我已经花了几个小时研究这个的变体,但无论我尝试什么,尝试访问 span 结果都是 null 并且测试失败。
下面是其中一项测试的示例
if('should show the correct item count', () =>{
let component = fixture.componentInstance;
component.itemCount = 4;
fixture.detectChanges();
let bridge = fixture.debugElement.query(By.css('.bridge'));
expect(bridge).tobeTruthy();
});
正如我上面所说,通过多次尝试,无论如何,这总是空的。我调试了测试并确认使用了正确的 groupId 也确认了 itemCount 不是 null 或空所以 *ngIf 的两个条件都应该满足 - 但跨度不存在所以我必须假设有有些不对劲。
请原谅打字错误,我正在手动复制代码,但目前确实如此 运行,只是没有成功。
有什么指点吗?
更新:
这里有更多信息,组件填充了虚拟数据的 beforeEach。
const ItemServiceStub = jasmine.createSpyObj('ItemService', ['getItems']);
beforeEach(() =>{
TestBed.configureTestingModule({
declarations: [ItemComponent],
providers: [{provide: ItemService, useValue: ItemServiceStub}]
}).compileComponents();
});
beforeEach(() => {
itemService = Testbed.inject(ItemService);
spyOn(itemService, 'getItems').and.callFake(() => of(fakeItems));
fixture = TestBed.createComponent(ItemComponent);
fixture.autoDetectChanges();
});
更新 2 这是正在设置的假数据
describe('item tests', () => {
let fakeItems: Item[];
fakeItems = [
{GroupId: '2', ItemName: 'test', isExternal: false},
{GroupId: '3', ItemName: 'testing', isExternal: false},
{GroupId: '4', ItemName: 'test item', isExternal: false}
];
});
试试这个:
it('should show the correct item count', () =>{
let component = fixture.componentInstance;
component.items = [...fakeItems];
component.itemCount = 4;
fixture.detectChanges();
let bridge = fixture.debugElement.query(By.css('.bridge'));
console.log(bridge); // make sure it logs something to the console
expect(bridge).toBeTruthy();
});
如果这不起作用,我认为在 ul
之上有一个 *ngIf
是不正确的,因此不会显示此 ul
。
要对此进行测试,请尝试:
<ul class="dummy-class" *ngFor="let item of items">
<li>
<ng-container *ngIf="itemCount && item.GroupId == 4">
<span class="bridge">{{itemCount}}</span>
</ng-container>
</li>
it('should show the correct item count', () =>{
let component = fixture.componentInstance;
component.items = [...fakeItems];
component.itemCount = 4;
fixture.detectChanges();
let bridge = fixture.debugElement.query(By.css('ul.dummy-class'));
console.log(ul); // make sure it logs something to the console
expect(ul).toBeTruthy();
});