5

所以我正在尝试测试一个主题的行为,但它不起作用,而且似乎有些事情我没有正确理解。考虑以下测试:

it('marble testing subject test', () => {
    const obs$: Subject<number> = new Subject<number>();

    obs$.next(42);
    obs$.next(24);

    expect(obs$.asObservable()).toBeObservable(hot('xy', { x: 42, y: 24 }));
  });

这将失败并显示以下错误消息:

Expected $.length = 0 to equal 2.
Expected $[0] = undefined to equal Object({ frame: 0, notification: Notification({ kind: 'N', value: 42, error: undefined, hasValue: true }) }).
Expected $[1] = undefined to equal Object({ frame: 10, notification: Notification({ kind: 'N', value: 24, error: undefined, hasValue: true }) }).

我想我有点理解为什么:(Subject每个文档)仅在订阅开始后才发出值。该toBeObservable()函数(我假设)订阅了Subject,所以我的 2 个next调用发生在此之前,所以它们不会发出。

所以我的问题是,我将如何测试这样的东西?即随着时间的推移测试来自一个主题的一系列排放?这可能与大理石测试有关吗?我可以通过将其更改为 a 来使其工作,ReplaySubject但如果我这样做,大理石图必须是(xy)而不是xy.

谢谢。

4

1 回答 1

1

我在 Angular 应用程序的上下文中工作

asObservable我的服务,关键部分是我将我的东西定义为一个吸气剂,如果我只是将我的东西定义为一个属性,那么我就有机会实际监视,things$那么间谍就不起作用了:

@Injectable({
  providedIn: 'root'
})
export class ApiService {

  private things = new BehaviorSubject<Array<string>>([]);

  public get things$(): Observable<boolean> {
    return this.things.asObservable().pipe(map((things) => things.length > 0))
  }
}

然后在我的测试中,我猜关键部分是我正在监视asObservable. things BehaviourSubject像这样:

describe('#things$', () => {

    it('should ', () => {
      const things.   = 'a-b-a';
      const expected =  't-f-t';
      // spy on
      spyOn(service['things'], 'asObservable').and.returnValue(hot(things, {
        a: ['a', 'b'],
        b: []
      }));

      expect(service.things$).toBeObservable(cold(expected, {
        t: true,
        f: false
      }));
    });
  });
于 2020-05-03T16:22:53.223 回答