Ошибка: ожидается, что шпион MovieService.getWatchListedMovies был вызван.Угловое модульное тестирование - PullRequest
0 голосов
/ 23 февраля 2019
  • Файл компонента с именем список наблюдения , который зависит от MovieService (службы) для извлечения фильма.

  • вызовngOnInit () вызовет MovieService.getWatchlistedMovies ()

  • код компонента указан ниже,

export class WatchlistComponent implements OnInit {

  movies: Array<Movie>;
  movieType:string;
  
  constructor(private movieService:MovieService,private route:ActivatedRoute) { 

    this.movies=[];
    this.route.data.subscribe((data)=>{
      this.movieType=data.movieType
    });
   
  }

  ngOnInit() {

    this.movieService.getWatchListedMovies()
    .subscribe((movies)=>{
     this.movies.push(...movies);
       },
       this.handleErrors()
       );

  }
  • Юнит-тестирование компонента (список наблюдения) с использованием jasmine.spy объекта на movieService (Служба)

  • Код файла наблюдения.spec.ts следующим образом:

describe('WatchlistComponent', () => {
  let component: WatchlistComponent;
  let fixture: ComponentFixture<WatchlistComponent>;
  let movieServiceFake:jasmine.SpyObj<MovieService>;
  let movieService;
  let stubTmdbMovies: Movie[];
  beforeEach(async(() => {
    movieServiceFake = jasmine.createSpyObj('MovieService', ['getWatchListedMovies']);


    TestBed.configureTestingModule({
      imports: [MovieModule,
        RouterTestingModule,
        HttpClientTestingModule],
      providers: [{ provide: MovieService, useValue: movieServiceFake }]
    })
  }));

  beforeEach(() => {
    fixture = TestBed.createComponent(WatchlistComponent);
    component = fixture.componentInstance;
    movieServiceFake = TestBed.get(MovieService);
  });

  it('should create watchlist', () => {
    expect(component).toBeTruthy();
  });

  it('should call ngOnInIt', () => {
    //Arrange
    let spyOnComponent = spyOn(component, 'ngOnInit');
    movieServiceFake.getWatchListedMovies.and.callFake(() => { return of(stubTmdbMovies) });
    //Act
    component.ngOnInit();
    //Assert
    expect(spyOnComponent).toHaveBeenCalled();
    expect(movieServiceFake.getWatchListedMovies).toHaveBeenCalled();//error line
  });
});

` MovieModule , где я зарегистрировал список наблюдения и MovieService. как показано ниже

@NgModule({
  imports: [
    CommonModule,
    HttpClientModule,
    MovieRouterModule,
    MatCardModule,
    MatButtonModule,
    MatSnackBarModule,
    FormsModule,
    ReactiveFormsModule,
    MatInputModule
      ],
  declarations: [ContainerComponent,TmdbContainerComponent,TumbnailComponent, WatchlistComponent, MovieDetailsComponent],
  
  exports:[
    MovieRouterModule,
    TumbnailComponent,
    ContainerComponent,
    TmdbContainerComponent
  ],
  providers:[
    MovieService
  ]
})
export class MovieModule { }

1 Ответ

0 голосов
/ 23 февраля 2019

Просто предположение, попробуйте переместить строку

movieServiceFake = TestBed.get(MovieService);

в начало теста, например

it('should call ngOnInIt', () => {
    movieServiceFake = TestBed.get(MovieService);
    ....
});
...