代码之家  ›  专栏  ›  技术社区  ›  physicsboy

使用createSpyObj进行单元测试

  •  0
  • physicsboy  · 技术社区  · 7 年前

    我有一个函数调用另一个本身使用http订阅的函数,我在测试它时遇到了问题。。。

    真菌成分

    id = 1;
    
    myFunct() {
      this.myService.delete(this.id);
    }
    

    我的服务

    delete(id) {
      this.http.delete(this.myUrl + '/' + id).subscribe()
    }
    

    测验

    let mockService;
    
    beforeEach(() => {
      TestBed.configureTestingModule({
        mockService = createSpyObj(['delete']);
    
        imports: ...,
        declarations: ...,
        providers: [
          {provide: MyService, useValue: mockService}
        ]
      }).compileComponents();
    
      fixture = ...;
      component = ...;
      fixture.detectChanges();
    });
    
    it('should test delete', () => {
      mockService.delete.and.returnValue({ subscribe: () => {} });
      component.myFunct();
      expect(mockService.delete).toHaveBeenCalledTimes(1);
    });
    

    我的测试返回错误:

    无法读取未定义的属性“subscribe”

    1 回复  |  直到 7 年前
        1
  •  3
  •   jakubm    7 年前

    常见的模式是从您的服务方法返回observable,并在组件内部订阅。

    大概是这样的:

    真菌成分

     id = 1;
    
     myFunct() { 
        this.myService.delete(this.id).subscribe( 
         (result) => console.log(result),
         (error) => console.log(error)
     };
    

    我的服务

     delete(id): Observable<any> {
       this.http.delete(this.myUrl + '/' + id)
     }
    

    测验

    imports {of} from 'rxjs'
    
    let mockService;
    
    beforeEach(() => {
      TestBed.configureTestingModule({
        mockService = createSpyObj(['delete']);
    
        imports: ...,
        declarations: ...,
        providers: [
          {provide: MyService, useValue: mockService}
        ]
      }).compileComponents();
    
      fixture = ...;
      component = ...;
      fixture.detectChanges();
    });
    
    it('should test delete', () => {
      mockService.delete.and.returnValue(of({id: 1}));
      component.myFunct();
      expect(mockService.delete).toHaveBeenCalledTimes(1);
    });