angular - 如何在 Angular 单元测试中模拟函数中的服务调用?

标签 angular unit-testing jasmine karma-runner

我正在尝试为以下函数编写一个测试用例:

foo = () => { 
  this.someService.getDetails({key:'value'}).subscribe(details => {
  //do stuff
    this.someService.getMoreDetails().subscribe(moreDetails => {
    //do stuff
   });
  });
}

该服务如下所示:

    getDetails = (args) :Observable<any> {
      return this.http.post<any>(//calls)
    } 
// similar for getMoreDetails

我编写的测试文件如下所示:

     const someServiceStub = jasmine.createSpyObj('someService', ['getDetails', 'getMoreDetails']);
...
...

    it('should called getMoreDetails', () => {
        component.foo();
        fixture.detectChanges();
        someServiceStub.getDetails.and.returnValue(Observable.of
          ({ Details: 'Tired of giving you details'})
        );
        expect(someServiceStub.getMoreDetails).toHaveBeenCalled();
      });

但是,我的测试用例失败,并给出错误“无法读取未定义的属性订阅”(对于 foo 函数内的第一行)。

我也尝试过使用模拟服务类,但出现了同样的错误。 可能的原因是什么以及如何解决?

最佳答案

首先调用 foo() 函数,该函数调用服务的 getDetails() 方法。这个方法是一个 spy ,你从来没有告诉 spy 要返回什么,所以它返回未定义。

然后,你告诉 spy 要返回什么。已经太晚了:服务电话已经打了。告诉 spy 调用foo()之前返回什么。

关于angular - 如何在 Angular 单元测试中模拟函数中的服务调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54050891/

相关文章:

SSR 的 Angular 7 Cookie(通用)

angular - 如何以 Angular 2将一条路线导航到另一条路线

unit-testing - grails-测试delete()

javascript - 在 Jasmine 测试中使用 AngularJS 和 Karma

javascript - 我正在创建一个全局变量吗?

angular - 对 Angular 2 应用程序中的所有路由使用基础保护

angular - 在 Angular2 的路由器中获取事件路由上的组件实例?

c# - 如何测试 ActionFilterAttribute - OnActionExecuted

unit-testing - 测试具有来自src/groovy的bean的grails Controller

javascript - 在 AngularJS Controller 规范中测试来自服务的回调