【问题标题】:unit testing observables with createSpyObj使用 createSpyObj 对 observable 进行单元测试
【发布时间】:2019-05-20 22:11:55
【问题描述】:

我有一个函数调用另一个本身使用 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);
});

我的测试带回了错误:

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

【问题讨论】:

    标签: angular typescript unit-testing mocking spy


    【解决方案1】:

    常见的模式是从你的服务方法返回 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);
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-08
      • 2018-05-10
      • 2020-03-07
      相关资源
      最近更新 更多