代码之家  ›  专栏  ›  技术社区  ›  Picci

角度茉莉花测试无法触发用fromEvent rxjs运算符创建的observate

  •  4
  • Picci  · 技术社区  · 6 年前

    我有个简单的案子。标准 AppComponent 角度应用程序的 ChildComponent 在它自己的模块中定义的 ChildModule 是的。

    的模板 子组件 很简单

    <div class="child" (click)="testClick($event)"></div>
    

    子组件 有一个更简单的 testClick(event) 只在控制台上记录消息的方法。

    testClick(event) {
        console.log(event);
    }
    

    现在我想建立一个测试 附加组件 模拟点击 子组件 是的。

    这是测试代码

    describe('AppComponent', () => {
      let fixture: ComponentFixture<AppComponent>;
      let app: AppComponent;
      let child: DebugElement;
    
      beforeEach(async(() => {
        TestBed.configureTestingModule({
          imports: [ ChildModule ],
          declarations: [
            AppComponent
          ],
        }).compileComponents();
      }));
      beforeEach(() => {
        fixture = TestBed.createComponent(AppComponent);
        app = fixture.debugElement.componentInstance;
        child = fixture.debugElement.query(By.css('.child'));
        fixture.detectChanges();
      });
    
      it(`should create the child'`, async(() => {
        expect(child).toBeTruthy();
      }));
    
      it(`clicks on the child and the relative Observable emits`, async(() => {
        setTimeout(() => {
          child.triggerEventHandler('click', 'clicked');
        }, 100);
    
      }));
    
    });
    

    测试工作,特别是第二个测试打印 clicked 控制台上的消息。

    现在我有点复杂了 子组件 . 我想在 click 事件使用 fromEvent 操作员和 ViewChild 是的。

    所以代码变成

    export class ChildComponent implements AfterViewInit {
      @ViewChild('child') private childElement: ElementRef;
    
      ngAfterViewInit() {
        const testClick$ = fromEvent(this.childElement.nativeElement, 'click');
        testClick$.subscribe(d => console.log('test click in child', d));
      }
    }
    

    我用 ng serve 我在控制台上看到两条信息,一条是 testClick 方法,并通过订阅 testClick$ 可观察的。

    如果我现在运行与以前相同的测试,我希望在控制台上也会看到相同的两条消息相反,我只看到 测试单击 方法。订阅的消息,即 'test click in child' ,不出现,这意味着 测试单击$ 不发射时 child.triggerEventHandler('click', 'clicked'); 被处决。

    我怎样才能用 来自事件 工作 茉莉 测验?我做错什么了?

    1 回复  |  直到 6 年前
        1
  •  3
  •   Picci    6 年前

    最后我找到了一种方法来触发事件,可以在 fromEvent RXJS的功能。

    解决方案的灵感来自 this post .

    其思想是,为了能够从dom事件创建事件流,必须使用 dispatchEvent 在DebugElement包装的本机元素上。

    所以,与其这么做

    child.triggerEventHandler('click', 'clicked');
    

    你必须用一些像

    child.nativeElement.dispatchEvent(new MouseEvent('click', {...});