单元测试错误Angular |无法读取未定义的属性“订阅”

时间:2020-07-23 17:48:23

标签: angular unit-testing jasmine karma-jasmine

我正在执行单元测试错误:无法读取未定义的属性“ subscribe”。

TypeError: Cannot read property 'subscribe' of undefined
    at TranslatePipe.transform (http://localhost:9876/_karma_webpack_/webpack:/node_modules/@ngx-translate/core/fesm5/ngx-translate-core.js:1540:1)
    at Object.eval [as updateDirectives] (ng:///DynamicTestModule/LoginFormComponent.ngfactory.js:390:38)
    at Object.debugUpdateDirectives [as updateDirectives] (http://localhost:9876/_karma_webpack_/webpack:/node_modules/@angular/core/fesm5/core.js:23911:1)
    at checkAndUpdateView (http://localhost:9876/_karma_webpack_/webpack:/node_modules/@angular/core/fesm5/core.js:23307:1)
    at callViewAction (http://localhost:9876/_karma_webpack_/webpack:/node_modules/@angular/core/fesm5/core.js:23548:1)
    at execComponentViewsAction (http://localhost:9876/_karma_webpack_/webpack:/node_modules/@angular/core/fesm5/core.js:23490:1)
    at checkAndUpdateView (http://localhost:9876/_karma_webpack_/webpack:/node_modules/@angular/core/fesm5/core.js:23313:1)
    at callViewAction (http://localhost:9876/_karma_webpack_/webpack:/node_modules/@angular/core/fesm5/core.js:23548:1)
    at execComponentViewsAction (http://localhost:9876/_karma_webpack_/webpack:/node_modules/@angular/core/fesm5/core.js:23490:1)
    at checkAndUpdateView

我的组件是一个容器,该容器调用将登录名和标头组件与服务一起使用的“ ngx-translate”来选择所使用的语言。

我的规格:

import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { LoginContainerComponent } from './login-container.component';
import { CommonModule } from '@angular/common';
import { SharedModule } from '../shared/shared.module';
import { TranslateModule, TranslateService, TranslatePipe, TranslateLoader } from '@ngx-translate/core';
import { MaterialModule } from '../material.module';
import { ReactiveFormsModule } from '@angular/forms';
import { LoginFormComponent } from './components/login-form/login-form.component';
import { Router } from '@angular/router';
import { HttpClient, HttpHandler } from '@angular/common/http';
import { InternationalizationService } from '../services/internationalization/internationalization.service';
import { TranslateHttpLoader } from '@ngx-translate/http-loader';
import {  of } from 'rxjs';
import { PlatformModel } from '../shared/models/header.model';
import { Injectable } from '@angular/core';


@Injectable({
  providedIn: 'root'
})
export class InternationalizationServiceStub {

  public data: PlatformModel = new PlatformModel();

  constructor(private translate: TranslateService) { }

  public setDefaultLanguage(code?: string, label?: string) {
    code = 'pt-br';
    label = 'portugues';
    this.data = JSON.parse(localStorage.getItem('platformData'));
    this.data = { ...this.data, selectedLanguage: code, labelLanguage: label };
    if (label) {
      this.data = { ...this.data, labelLanguage: label };
    }
    localStorage.setItem('platformData', JSON.stringify(this.data));
    this.translate.use(code);
  }
}

function HttpLoaderFactory(http: HttpClient) {
  return new TranslateHttpLoader(http, './assets/i18n/', '.json');
}

describe('LoginContainerComponent', () => {
  let component: LoginContainerComponent;
  let fixture: ComponentFixture<LoginContainerComponent>;

  beforeEach(async(() => {

    const translateServiceStub = {
      use(lang: any): any {
        return of(lang);
      },
      get(key: any): any {
        return of(key);
      }
    };
    const internationalizationStub = {
      setDefaultLanguage: () => ({})
    };
    const routerStub = {
      navigate: array => ({})
    };
    const httpClientStub = {};
    const httpHandlerStub = {};

    TestBed.configureTestingModule({
      declarations: [LoginContainerComponent, LoginFormComponent],
      imports: [
        CommonModule,
        SharedModule,
        MaterialModule,
        ReactiveFormsModule,
        TranslateModule.forRoot({
          loader: {
            provide: TranslateLoader,
            useFactory: HttpLoaderFactory,
            deps: [HttpClient]
          }
        })
      ],

      providers: [
        { provide: TranslateService, useValue: translateServiceStub },
        { provide: Router, useValue: routerStub },
        { provide: InternationalizationService, useClass: InternationalizationServiceStub },
        { provide: HttpClient, useValue: httpClientStub },
        { provide: HttpHandler, useValue: httpHandlerStub },
      ],
    }).compileComponents();
  }));

  beforeEach(() => {
    fixture = TestBed.createComponent(LoginContainerComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  });
  describe('expect login container', () => {
    it('expect call', () => {
      expect(component).toBeTruthy();
    });
  });
});

打印错误: Error unit test Karma

0 个答案:

没有答案