Angular2服务单元测试因TypeError失败:undefined不是对象

时间:2016-10-02 16:47:11

标签: testing angular karma-runner

我正在测试我的authService。这是完整的测试,但是Karma告诉我,authService是未定义的。我有很多服务,AuthService依赖它,但我提供并正确地注入它们。

  

错误:无法解析' AuthService'(BackendService,Store,LoggerService,undefined,ErrorService)的所有参数。确保所有参数都使用Inject进行修饰,或者使用有效的类型注释以及“AuthService'用Injectable装饰。 in /var/folders/zb/tpysrhsx7hbg1dnsn4gwtqq00000gn/T/8715f9a6c29e748f52c8f59e3e1daae3.browserify(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 个答案:

答案 0 :(得分:-1)

我不知道它是否相关,只是说我有一个几乎完全相同的问题,我在official docs之后就如何测试服务解决了这个问题。希望它有所帮助!