我正在执行单元测试错误:无法读取未定义的属性“ 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();
});
});
});