Angular 订阅块内的角度测试未运行

Angular 订阅块内的角度测试未运行,angular,jasmine,Angular,Jasmine,我试图用Angular测试一个服务,但我无法进入服务的subscribe块,也无法找出我做错了什么。这是我的服务: import { Injectable } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import 'rxjs/add/operator/switchMap'; @Injectable() export class MovieService { getNowPlayin

我试图用Angular测试一个服务,但我无法进入服务的subscribe块,也无法找出我做错了什么。这是我的服务:

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';

import 'rxjs/add/operator/switchMap';

@Injectable()
export class MovieService {

  getNowPlaying() {
    return this.http.get('https://api.themoviedb.org/3/movie/now_playing?api_key=[MY KEY]&language=en&region=US').switchMap(res => {
      const page = Math.ceil(res['total_pages'] * Math.random());
      return this.http.get(`https://api.themoviedb.org/3/movie/now_playing?api_key=[MY KEY]&language=en&region=US&page=${page}`);
    });
  }

  constructor(private http: HttpClient) { }

}
还有我的测试:

describe('getNowPlaying', () => {
    it('should get a page of now playing movies from the api', async(
      inject([MovieService, HttpTestingController], (movieService: MovieService, backend: HttpTestingController) => {
        movieService.getNowPlaying().subscribe(res => {
          console.log('hi');
        });

        backend.expectOne({
          url: 'https://api.themoviedb.org/3/movie/now_playing?api_key=[MY KEY]&language=en&region=US',
          method: 'GET'
        });
      }),
    ));
})

backend.expectOne测试通过,但我只是尝试将“hi”记录到控制台,以显示我正在进入订阅块,而没有任何日志。任何帮助都将不胜感激

您将无法看到subscribe块中的任何代码,因为与setTimeout一样,此代码将异步工作。Angular有很多现成的工具来处理异步测试:
async
fakeasync

如果需要等待异步操作完成,只需将整个
it
案例包装到
fakeasync
中,然后使用
tick()
。您将在本文中找到一个示例:

更新 如果需要查看API调用返回的内容,只需在subscribe块外部声明一个变量,并在其内部为其分配响应即可。然后记录下来

it('should get a page of now playing movies from the api', fakeAsync(
  inject([MovieService, HttpTestingController], (movieService: MovieService, backend: HttpTestingController) => {
    let response;

    movieService.getNowPlaying().subscribe(res => {
      response = res;
    });
    tick();

    expect(response).toEqual(...);

    backend.expectOne({
      url: 'https://api.themoviedb.org/3/movie/now_playing?api_key=[MY KEY]&language=en&region=US',
      method: 'GET'
    });
  }),
));

谢谢不幸的是,它已经包装在async()中。我也尝试过fakeAsync和tick(),但没有成功。根据包含的答案,测试失败。我期望响应被定义,但它说它期望未定义被定义