【问题标题】:How to test a subscription with a plain subject in service如何使用服务中的普通主题测试订阅
【发布时间】:2019-02-13 17:17:49
【问题描述】:

我想测试一个组件,它订阅了服务中的某个主题。

组件订阅:

let x: string[] = [];

public ngAfterViewInit(): void {
  this.subscription = this.service.observer$.subscribe((data: any) => {
    this.x = data.value;
    ...
  }
}

服务具有主题属性:

public observer$: Subject<any>;

在测试用例中,我尝试如下设置:

beforeEach(() => {
    fixture = TestBed.createComponent(Component);
    component = fixture.componentInstance;
    service = fixture.debugElement.injector.get(Service);
    fixture.detectChanges();
  });

it('should get a subscription event', () => {
    const response: any[] = [];
    service.observer$ = new Subject<any>();
    service.observer$.next(['some content']);

    fixture.detectChanges();

    expect(component.x.length).toBeGreaterThan(0);

  });

这不起作用。 x 保持为空。

谁能提供正确的测试方法?我看到了一些示例,其中该服务为observer.new() 提供了一种方法,然后测试人员会监视该方法。但是没有关于如何让它工作的例子。

【问题讨论】:

    标签: angular rxjs observable karma-runner subject


    【解决方案1】:

    AfterViewInit 仅在每次初始化时触发。 因此,您的第二个 fixture.detectChanges() 不会再次触发它。 您需要删除beforeEach中的fixture.detectChanges()

    类似的东西

    beforeEach(() => {
        fixture = TestBed.createComponent(Component);
        component = fixture.componentInstance;
        service = fixture.debugElement.injector.get(Service);
      });
    
    it('should get a subscription event', () => {
        const response: any[] = [];
        service.observer$ = new Subject<any>();
        fixture.detectChanges();
    
        service.observer$.next(['some content']);
        expect(component.x.length).toBeGreaterThan(0);
    
      });
    

    【讨论】:

    • 请忽略 detectChanges 方法。这应该与这个问题无关。问题是该组件似乎没有在此处收到事件 afaik。尽管如此,我还是尝试删除 beforeEach 中的 detectChanges,但这在运行测试用例时只给了我生命周期错误。
    • 虽然question 似乎需要手动调用ngAfterViewInit。在使用.next()之前尝试调用它
    • 不幸的是,这也无济于事。我尝试使用已在 AfterViewInit 中设置的变量,该变量设置正确,因此被调用。感谢您尝试提供帮助。我想与服务的耦合似乎不正确。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-12
    • 1970-01-01
    • 1970-01-01
    • 2020-08-31
    • 2021-08-06
    相关资源
    最近更新 更多