Angular单元测试可观察到订阅方法没有触发

时间:2018-05-12 12:51:21

标签: angular unit-testing jasmine observable

如何在单元测试中获得此订阅。

.close.then((resolve: IModelInstance): void => {
    resolve.status$.subscribe((status: Status): void => {
      this._checkStatus(status);
    });
  });

this._checkStatus(status)有一些逻辑可以检查值以触发组件的输出。

现在到目前为止,在我的单元测试中,我已经嘲笑了返回解决方案回调的承诺:

......as Spy).and.returnValue({
  close: new Promise((resolve: Function): void => {
    closeResolve = resolve;
  })
});

传递给closeResolve的数据如下:

        beforeEach(async(() => {

          closeResponseSubject = new Subject<Status>();

          closeResponse = {} as Partial<Instance> as Instance;

          closeResponse.status$ = closeResponseSubject.asObservable();

          closeResponseSubject.next(Status.CREATED);

          closeResolve(closeResponse);
        }));

使用此appraoch时,在组件中,测试会进入“then”但不会进入susbcribe。我在这里看了不同的问题和答案,但到目前为止还没有运气。我只是不明白为什么测试不会进入订阅。我不知道

1 个答案:

答案 0 :(得分:0)

无法弄清楚为什么订阅永远不会触发这个appraoch, 所以不要这样做:

.close.then((resolve: IModelInstance): void => {
    resolve.status$.subscribe((status: Status): void => {
      this._checkStatus(status);
    });
  });

我改为使用了这个实现:

.close.then((resolve: IModelInstance): void => {
    this._checkStatus(resolve.status);
  });

然后在单元测试中我有以下数据模拟 - promise模型保持不变:

closeResponse = {
  status: Status.CREATED
} as Partial<Instance> as Instance;

...............................................

beforeEach(async(() => {
  closeResolve(closeResponse);
}));

通过这样做,我不需要订阅status $来获取状态模型的值。我只是指向另一个属性状态,它也具有我感兴趣的价值。

就像@Antoniossss建议的那样:“整个想法是编写可以通过简单测试进行测试的可测试代码”。