【问题标题】:Testing select input change in Angular2/Jasmine测试 Angular2/Jasmine 中的选择输入变化
【发布时间】:2017-11-30 20:18:25
【问题描述】:

我无法弄清楚如何在我的 jasmine 单元测试中模拟下拉列表值的变化。

当下拉列表值改变时,它会发出一个事件。

我目前的测试看起来像:

spyOn(component.varChange, 'emit');

let selectEl: DebugElement = fixture.debugElement.query(By.css("#selectBox"));
selectEl.nativeElement.selectedIndex = 0;
selectEl.nativeElement.dispatchEvent(new Event("input"));
fixture.detectChanges();
expect(component.varChange.emit).toHaveBeenCalledWith(testData[0]);

我收到的错误是:Expected spy emit to have been called with [ Object({ ... }) ] but it was never called.

【问题讨论】:

    标签: angular testing select drop-down-menu jasmine


    【解决方案1】:

    这就是我使用选择框测试类似组件的方式:

    fit('should emit event when option is selected', async(() => {
      component.pageSelected.subscribe(() => {
         expect(true).toBeTruthy();
      });
      component.pages = [{id: 1, name: 'julia'}, {id: 2, name: 'xxx'}];
      fixture.detectChanges();
    
      const options = debugElement.queryAll(By.css('option'));
      dispatchFakeEvent(options[0].nativeElement, 'change');
      fixture.detectChanges();
    }));
    

    ===

    pageSelected 是组件的输出。基本上我必须测试选择选项何时更改组件触发事件。

      @Output() pageSelected = new EventEmitter<number>();
    

    ====

    这里是 dispatchFakeEvent

    // from angular materail
    export function createFakeEvent(type: string) {
     const event = document.createEvent('Event');
     event.initEvent(type, true, true);
     return event;
    }
    
    export function dispatchFakeEvent(node: Node | Window, type: string) 
    {
      node.dispatchEvent(createFakeEvent(type));
    }
    

    【讨论】:

    • 请原谅我的无知,但我收到错误“'myComponent' 类型上不存在属性 'pageSelected'”...?
    • 这是组件的输出。基本上我必须测试选择选项何时更改组件触发事件。 @Output() pageSelected = new EventEmitter();
    • 而且“dispatchFakeEvent”也是一个事件发射器?
    猜你喜欢
    • 1970-01-01
    • 2016-09-18
    • 2018-07-16
    • 2016-12-23
    • 1970-01-01
    • 2016-10-15
    • 2017-05-10
    • 2016-06-05
    • 2018-12-23
    相关资源
    最近更新 更多