2016-10-02 117 views
0

我正在測試我的authService。這是完整的測試,但Karma告訴我,authService是未定義的。我有很多AuthService依賴的服務,但我提供並正確地注入了它們。Angular2服務單元測試失敗,出現TypeError:undefined不是對象

Error: Cannot resolve all parameters for 'AuthService'(BackendService, Store, LoggerService, undefined, ErrorService). Make sure that all the parameters are decorated with Inject or have valid type annotations and that 'AuthService' is decorated with Injectable. in /var/folders/zb/tpysrhsx7hbg1dnsn4gwtqq00000gn/T/8715f9a6c29e748f52c8f59e3e1daae3.browserify (line 34976)

authservice.spec.ts

import { provide } from "@angular/core"; 
import { AuthHttp } from "angular2-jwt"; 
import { HTTP_PROVIDERS, XHRBackend } from "@angular/http"; 
import { MockBackend } from "@angular/http/testing"; 
import { 
    TEST_BROWSER_DYNAMIC_PLATFORM_PROVIDERS, 
    TEST_BROWSER_DYNAMIC_APPLICATION_PROVIDERS 
} from "@angular/platform-browser-dynamic/testing"; 
import { 
    beforeEachProviders, 
    inject, 
    beforeEach, 
    it, 
    describe, 
    setBaseTestProviders 
} from "@angular/core/testing"; 
import { Subject } from "rxjs/Subject"; 
import { AuthService } from "./auth.service"; 
import { BackendService } from "../../backend/backend.service"; 
import { ErrorService } from "../../error/error.service"; 
import { LoggerService } from "../../logger/logger.service"; 
import { NavService } from "../../nav/nav-service/nav.service"; 
import { Store } from "@ngrx/store"; 
import { TestComponentBuilder } from "@angular/compiler/testing"; 
import { ToastController, AlertController } from "ionic-angular"; 
setBaseTestProviders(TEST_BROWSER_DYNAMIC_PLATFORM_PROVIDERS, TEST_BROWSER_DYNAMIC_APPLICATION_PROVIDERS); 

describe("AuthService",() => { 

    let response = new Subject(); 
    let tcb; 
    let authService; 
    let navService; 
    let backendService; 
    let errorService; 
    let store; 
    let loggerService; 

    class StubErrorService extends ErrorService { 
     constructor() { 
      super(null, null); 
     } 

     toast(title) { 
      console.error(title); 
     } 

     modal(title, subtitle) { 
      console.error(title, subtitle); 
     } 
    } 

    class StubBackendService extends BackendService { 

    } 

    class StubStore extends Store<any> { 

    } 

    class StubLoggerService extends LoggerService { 

    } 

    class StubNavService extends NavService { 

    } 

    // PROVIDE 

    beforeEachProviders(() => [ 
     HTTP_PROVIDERS, 
     provide(AuthHttp, { 
      useValue: { 
       get: (url: string) => { 
        return response; 
       } 
      } 
     }), 
     AuthService, 
     TestComponentBuilder, 
     provide(ToastController, {useClass: null}), 
     provide(AlertController, {useClass: null}), 
     provide(ErrorService, {useClass: StubErrorService}), 
     provide(XHRBackend, {useClass: MockBackend}), 
     provide(BackendService, {useClass: StubBackendService}), 
     provide(Store, {useClass: StubStore}), 
     provide(LoggerService, {useClass: StubLoggerService}), 
     provide(NavService, {useClass: StubNavService}) 
    ]); 

    // INJECTS 

    beforeEach(inject([TestComponentBuilder, AuthService, ErrorService, BackendService, Store, LoggerService, NavService], (_tcb, as, es, bs, s, ls, ns) => { 
     tcb = _tcb; 
     authService = as; 
     navService = ns; 
     errorService = es; 
     store = s; 
     backendService = bs; 
     loggerService = ls; 
    })); 

    it("should test authservice",() => { 
     authService.logout(); 
    }); 
}); 

回答

-1

我不知道,如果它的相關了,只是說我有一個幾乎相同的問題,我解決它繼official docs如何測試服務。希望能幫助到你!

+1

一旦鏈接消失,僅鏈接答案就沒用了。請將解決方案的相關部分複製到答案中。 – isherwood

+0

從技術上講,只是說「閱讀文檔」根本沒有用處。尤其是鏈接頁面結果(截至2017年12月28日)以91頁的單詞文檔_(或至少77頁,如果我直接從網頁隱藏所有側面導航)_具有超過15,000字。 – Seika85