2016-12-30 37 views
1

我试图测试其使用的服务的组件(GamePanelComponent): 内GamePanelComponent.tsAngular2测试 - 注入服务的方法是没有定义

constructor(private playerService: PlayersService, private leaderBoardService: LeaderBoardService) { } 

comp.IsValidMove是利用玩家服务getPlayers方法,但不幸的是我得到这个错误:TypeError: Cannot read property 'getPlayers' of undefined

这是我的测试文件,它是根据Angular2测试教程编写的。你可以,看我注入其中有getPlayers()方法的存根(因为它是原服务的实例):

import { ComponentFixture, TestBed, async } from '@angular/core/testing'; 
import { By }    from '@angular/platform-browser'; 
import { DebugElement } from '@angular/core'; 

import { GamePanelComponent } from './gamepanel.component'; 
import { GamePanelOutputComponent } from '../gamepaneloutput/gamepaneloutput.component'; 

import { PlayersService } from '../../services/players/players.service'; 
import { LeaderBoardService } from '../../services/leaderboard/leaderboard.service'; 

import { Player } from '../../models/player/player'; 

describe('GamePanelComponent (inline template)',() => { 

    let comp: GamePanelComponent; 
    let fixture: ComponentFixture<GamePanelComponent>; 
    let playersService, playersServiceStub, componentPlayersService : PlayersService; 

    beforeEach(async (() => { 

    this.playersServiceStub = new PlayersService(); 
    this.playersServiceStub.players = []; 
    this.playersServiceStub.players[0] = new Player('','X'); 
    this.playersServiceStub.players[1] = new Player('','O'); 

    TestBed.configureTestingModule({ 
     declarations: [ GamePanelComponent, GamePanelOutputComponent ], // declare the test component 
     providers: [ { provide: PlayersService, useValue: playersServiceStub }, { provide: LeaderBoardService } ] 
    }).compileComponents() 
     .then(() => { 
      fixture = TestBed.createComponent(GamePanelComponent);    
      comp = fixture.componentInstance; 

      // PlayerService actually injected into the component 
      playersService = fixture.debugElement.injector.get(PlayersService); 
      componentPlayersService = playersService; 
      // PlayersService from the root injector 
      playersService = TestBed.get(PlayersService); 
     }); 
    })); 

    it('isValidMove',() => { 
     comp.ngOnInit(); 
     comp.game.board[0][0] = 'X';  
     let isValid = comp.isValidMove(0,0); 
     expect(isValid).toBe(false); 
    }); 

}); 

回答

3

你不应该在beforeEach回调使用this。这不是一堂课。因此this.playersServiceStub并不指向在beforeEach之外宣告的同一playerServiceStub。所以你传递undefined作为提供者。只需使用

playersServiceStub = new PlayersService();