【问题标题】:Angular unit tests observable with subscribe method not firing使用订阅方法不触发的角度单元测试可观察
【发布时间】:2018-05-12 12:51:20
【问题描述】:

如何让这个订阅在我的单元测试中触发。

.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);
        }));

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

【问题讨论】:

  • 你应该直接对你的checkStatus 进行单元测试。
  • @Antoniossss 在我的模拟测试中订阅失败时怎么可能。由于订阅中的回调方法调用了 checkStatus,并且回调的值被传递给 checkStatus。您将如何直接测试 checkStatus ? P.s checkStatus 是组件类的私有方法
  • 保护检查状态以使其可测试。整个想法是编写可以通过简单测试进行测试的可测试代码。
  • @Antoniossss 我明白你的意思,我花了这么多时间对这种方法进行单元测试,受够了,事实上我使用了一种更简单的方法,我应该这样做所以首先。更容易测试
  • 因此我什至不需要测试 checkStatus,在这种情况下,我对这个方法的结果感兴趣,那就是组件的发射。我可以轻松地 spyOn() 并在期望中使用间谍

标签: angular unit-testing jasmine observable


【解决方案1】:

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

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

我改用了这个实现:

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2018-08-31
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    相关资源
    最近更新 更多