2016-10-02 118 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