【问题标题】:How to test API without mocks and spies?如何在没有模拟和间谍的情况下测试 API?
【发布时间】:2021-04-16 22:28:29
【问题描述】:

有包含2个方法的服务:

export class CounterService {
  constructor(private http: HttpClient) {}

  getGirls(): Observable<any> {
    return this.http.get<any>('http://localhost:3000/girls');   // return some JSON
  }

  getObservableValue() {
    return of('observable value');
  }
}

我尝试编写单元测试:

describe('CounterService', () => {
  let service: CounterService;

  beforeEach(() => {
    TestBed.configureTestingModule({
      imports: [HttpClientTestingModule],
      providers: [CounterService],
    });
    service = TestBed.inject(CounterService);
  });

  it(
    'test should wait for CounterService.getObservableValue',
    waitForAsync(() => {
      service
        .getObservableValue()
        .subscribe((value) => expect(value).toBe('observable value'));
    })
  );

  it(
    'test should wait for CounterService.getGirls',
    waitForAsync(() => {
      service
        .getGirls()
        .subscribe((value) => expect(value).toBeTruthy());
    })
  );
});

结果测试 'test should wait for CounterService.getObservableValue' 成功,但测试 'test should wait for CounterService.getGirls' 不成功。 p>

Jasmine 显示以下消息:

SPEC 没有期望:测试应该等待 CounterService.getGirls

请帮我测试 getGirls() 没有间谍和任何模拟。有可能吗?

【问题讨论】:

    标签: angular unit-testing jasmine


    【解决方案1】:

    您必须使用HttpTestingController 发送请求。

    describe('CounterService', () => {
      let service: CounterService;
      let httpTestingController: HttpTestingController;
    
      beforeEach(() => {
        TestBed.configureTestingModule({
          imports: [HttpClientTestingModule],
          providers: [CounterService],
        });
        service = TestBed.inject(CounterService);
        httpTestingController = TestBed.inject(HttpTestingController);
      });
    
      afterEach(() => {
        // ensure no outstanding API calls
        httpTestingController.verify();
      });
    
      it(
        'test should wait for CounterService.getObservableValue',
        waitForAsync(() => {
          service
            .getObservableValue()
            .subscribe((value) => expect(value).toBe('observable value'));
        })
      );
    
      it(
        'test should wait for CounterService.getGirls',
        waitForAsync(() => {
          service
            .getGirls()
            .subscribe((value) => expect(value).toBeTruthy());
    
          const req = httpTestingController.expectOne('http://localhost:3000/girls');
          expect(req.request.method).toBe('GET');
          
          // flush this response
          req.flush(['Alicia', 'Tina', 'Michelle']);
        })
      );
    });
    

    This 是一篇很好的博文,可以帮助您进行 Http 测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-17
      • 2015-07-22
      • 2010-12-08
      • 1970-01-01
      • 1970-01-01
      • 2019-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多