2017-02-22 94 views
0

我已經如下Angular2茉莉花SpyOn方法不存在

export let AUTH_SERVICE = new OpaqueToken('auth.service'); 

export interface AuthService { 
    logIn(): void; 
    logOut(): void; 
} 

在我的測試類中定義的接口和不透明的令牌我提供的AuthService一個存根版本,即

@Injectable() 
class AuthServiceStub implements AuthService { 
    logIn(): void {} 
    logOut(): void {} 
} 

,並設置我的測試beforeEach如下

beforeEach(async(() => { 
     TestBed.configureTestingModule({ 
      declarations: [ LoginComponent ], 
      providers: [ 
       {provide: AUTH_SERVICE, useValue: AuthServiceStub} 
      ] 
     }); 
    })); 

然後我開始編寫測試,即

it('should call log in on AuthService',() => { 
     let authService = fixture.debugElement.injector.get(AUTH_SERVICE); 
     spyOn(authService, 'logIn'); 
     // expect will go here 
}); 

,但我得到以下錯誤

Error: <spyOn> : logIn() method does not exist 

看不到我在做什麼錯。有任何想法嗎?

+0

如果這是一個運行時錯誤,您可以檢查您的ide或瀏覽器中的'authService'實例以查看是否存在'logIn'方法。 – Igor

+0

還沒有讓我的腦袋適當地調試這些測試。然而,如果我將一個構造函數添加到'AuthServiceStub'並寫入到該構造函數的控制檯中,例如'console.log('CREATED')',它從不向控制檯輸出'CREATED' - 所以不知道我的存根服務是否曾經得到創造.... –

回答

6

這是因爲您在提供程序對象中使用useValue屬性。這意味着注入的值將是AuthServiceStub類本身。你想要的是,它的實例是否有這些方法。

要使測試起作用,請將useValue替換爲useClass。這將使Angular的依賴注入系統在創建提供者時實際實例化服務,並且您的調用fixture.debugElement.injector.get(AUTH_SERVICE);將返回適當的對象。

另外,您可以手動實例類:

it('should call log in on AuthService',() => { 
    let AuthService = fixture.debugElement.injector.get(AUTH_SERVICE); 
    let authService = new AuthService(); 
    spyOn(authService, 'logIn'); 
    // expect will go here 
}); 

不過,useClass是一個更好的解決方案,因爲它會處理該AuthService可能需要未來所有的注射。

+0

哈哈!作品....當閱讀測試文檔時完全通過了我。太好了,我可以繼續前進:) –