Angular 5 个组件测试 select 和触发事件
Angular 5 component testing select and triggered event
我有一个带有下拉菜单的组件。当更改时,它会触发一个事件,该事件通过数组进行过滤,以根据事件值从数组中获取 selectedProduct。
我的代码如下:
public onProductChanged(event): void {
this.selectedProduct = this.products.find((product: Products) => product.id == event.target.value);
}
我的 select 下拉菜单:
<select id="product" (change)="onProductChanged($event)">
<option>--- Please Select ---</option>
<option *ngFor="let product of products" [value]="product.id"> {{ product.displayName }} </option>
</select>
产品对象是一个对象:
{ "id": 1, "name": "name_here", "displayName": "Name Here" }
这一切都有效,但是我想在我的组件测试中测试更改 select 值会触发事件并检索到正确的值。
我的测试代码如下:
describe('Product selection', () => {
it('should select product', () => {
expect(component.selectedProduct).toBeUndefined();
productSelectElement.nativeElement.value = 'Product Name';
productSelectElement.nativeElement.dispatchEvent(new Event('change'));
fixture.detectChanges();
expect(component.onProductChanged).toHaveBeenCalled();
expect(component.selectedProduct).toEqual({ "id": 1, "name": "product_name", "displayName": "Product Name" });
});
});
已调用 productChanged 事件并且测试通过。然而,我的 selectedProduct 始终为空。如何使用下拉列表中的更改值触发事件?
事实证明,在之前的每一个中,我都为函数设置了一个 spyOn 而没有调用。工作代码如下:
beforeEach(() => {
fixture = TestBed.createComponent(SelectProductsComponent);
component = fixture.componentInstance;
component.products = products;
fixture.detectChanges();
productSelectElement = fixture.debugElement.query(By.css('#products'));
spyOn(component, 'onProductChanged').and.callThrough();
expect(component.products).toEqual(products);
expect(component.selectedProduct).toBeUndefined();
});
describe('Product selection', () => {
it('should select product', () => {
productSelectElement.nativeElement.value = 1;
productSelectElement.nativeElement.dispatchEvent(new Event('change'));
fixture.detectChanges();
expect(component.onProductChanged).toHaveBeenCalled();
expect(component.selectedProduct).toEqual({ "id": 1, "name": "product_name", "displayName": "Product Name" });
});
});
我有一个带有下拉菜单的组件。当更改时,它会触发一个事件,该事件通过数组进行过滤,以根据事件值从数组中获取 selectedProduct。
我的代码如下:
public onProductChanged(event): void {
this.selectedProduct = this.products.find((product: Products) => product.id == event.target.value);
}
我的 select 下拉菜单:
<select id="product" (change)="onProductChanged($event)">
<option>--- Please Select ---</option>
<option *ngFor="let product of products" [value]="product.id"> {{ product.displayName }} </option>
</select>
产品对象是一个对象:
{ "id": 1, "name": "name_here", "displayName": "Name Here" }
这一切都有效,但是我想在我的组件测试中测试更改 select 值会触发事件并检索到正确的值。
我的测试代码如下:
describe('Product selection', () => {
it('should select product', () => {
expect(component.selectedProduct).toBeUndefined();
productSelectElement.nativeElement.value = 'Product Name';
productSelectElement.nativeElement.dispatchEvent(new Event('change'));
fixture.detectChanges();
expect(component.onProductChanged).toHaveBeenCalled();
expect(component.selectedProduct).toEqual({ "id": 1, "name": "product_name", "displayName": "Product Name" });
});
});
已调用 productChanged 事件并且测试通过。然而,我的 selectedProduct 始终为空。如何使用下拉列表中的更改值触发事件?
事实证明,在之前的每一个中,我都为函数设置了一个 spyOn 而没有调用。工作代码如下:
beforeEach(() => {
fixture = TestBed.createComponent(SelectProductsComponent);
component = fixture.componentInstance;
component.products = products;
fixture.detectChanges();
productSelectElement = fixture.debugElement.query(By.css('#products'));
spyOn(component, 'onProductChanged').and.callThrough();
expect(component.products).toEqual(products);
expect(component.selectedProduct).toBeUndefined();
});
describe('Product selection', () => {
it('should select product', () => {
productSelectElement.nativeElement.value = 1;
productSelectElement.nativeElement.dispatchEvent(new Event('change'));
fixture.detectChanges();
expect(component.onProductChanged).toHaveBeenCalled();
expect(component.selectedProduct).toEqual({ "id": 1, "name": "product_name", "displayName": "Product Name" });
});
});