Wil*_* H. 1 observable karma-jasmine angular
我对在 Angular2+ 中进行测试比较陌生,并且正在设置我的文件进行测试。自从构建项目以来,我已经编写了很多代码,现在正在尝试测试其中的一部分。然而,许多这些测试现在都被破坏了,所以我现在试图删除不需要的默认测试或修复有用的测试。
这个特定的测试不会运行,因为它在遇到 It() 测试方法之前就失败了。我不确定我错过了什么,任何帮助将不胜感激。
我收到此错误:
Failed: Cannot read property 'subscribe' of undefined
TypeError: Cannot read property 'subscribe' of undefined
at AppComponent../src/app/app.component.ts.AppComponent.setupLanguageTranslation (src/app/app.component.ts:48:26)
at AppComponent../src/app/app.component.ts.AppComponent.ngOnInit (src/app/app.component.ts:32:14)
at checkAndUpdateDirectiveInline (node_modules/@angular/core/fesm5/core.js:22089:1)
at checkAndUpdateNodeInline (node_modules/@angular/core/fesm5/core.js:23353:1)
at checkAndUpdateNode (node_modules/@angular/core/fesm5/core.js:23315:1)
at debugCheckAndUpdateNode (node_modules/@angular/core/fesm5/core.js:23949:1)
at debugCheckDirectivesFn (node_modules/@angular/core/fesm5/core.js:23909:1)
at Object.eval [as updateDirectives] (ng:///DynamicTestModule/AppComponent_Host.ngfactory.js:9:9)
at Object.debugUpdateDirectives [as updateDirectives] (node_modules/@angular/core/fesm5/core.js:23901:1)
at checkAndUpdateView (node_modules/@angular/core/fesm5/core.js:23297:1)
Run Code Online (Sandbox Code Playgroud)
我尝试了各种具有类似问题的文章,包括但不限于:
App.component.ts
export class AppComponent implements OnInit, OnDestroy {
title = 'planox';
showError = false;
errorMessage = '';
translatedText: string;
constructor(private _translate: TranslateService,
private utils: Utils) {}
ngOnInit(): void {
this.setupLanguageTranslation();
}
ngOnDestroy(): void {
this._translate.onLangChanged.unsubscribe();
}
setupLanguageTranslation() {
this.subscribeToLangChanged();
// set language
this._translate.setDefaultLang('en'); // set English as default
this._translate.enableFallback(true); // enable fallback
// set current language
this.selectLang('en');
this.utils.error.subscribe(response => {
this.errorMessage = response;
this.showError = true;
setTimeout( () => {
this.showError = false;
}, 2000);
});
}
selectLang(lang: string) {
// set default;
this._translate.use(lang);
}
subscribeToLangChanged() {
// refresh text
this.refreshText();
return this._translate.onLangChanged.value;
}
refreshText() {
// refresh translation when language change
this.translatedText = this._translate.instant('hello world');
}
}
Run Code Online (Sandbox Code Playgroud)
app.component.spec.ts
import {TestBed, async, ComponentFixture, inject} from '@angular/core/testing';
import { RouterTestingModule } from '@angular/router/testing';
import { AppComponent } from './app.component';
import {TranslateService} from './translate/translate.service';
import Utils from './shared/utils';
import {MockTranslateService} from './mocks/mockTranslateService';
import {MockUtils} from './mocks/mockUtils';
import {TRANSLATIONS} from './translate/translation';
describe('AppComponent', () => {
let fixture: ComponentFixture<AppComponent>;
beforeEach(async(() => {
const mockTranslate = new MockTranslateService(TRANSLATIONS);
TestBed.configureTestingModule({
imports: [
RouterTestingModule
],
declarations: [
AppComponent
],
providers: [
{provide: TranslateService, useValue: mockTranslate},
{provide: Utils, useValue: MockUtils},
]
});
fixture = TestBed.createComponent(AppComponent);
fixture.detectChanges();
}));
it('should create the app', () => {
fixture = TestBed.createComponent(AppComponent);
const app = fixture.debugElement.componentInstance;
expect(app).toBeTruthy();
});
});
Run Code Online (Sandbox Code Playgroud)
实用程序.ts:
import {Subject, throwError} from 'rxjs';
import {Injectable} from '@angular/core';
import {Router} from '@angular/router';
import {Role} from '../classes/role/role.enum';
export enum KEY_CODE {
ENTER = 13,
RIGHT_ARROW = 39,
LEFT_ARROW = 37
}
@Injectable({
providedIn: 'root'
})
export default class Utils {
error: Subject<string> = new Subject<string>();
constructor(private router: Router) {}
handleError(service: string, error: Response | any, customMessage?: string) {
const err = service + '::handleError' + '= ' + error;
this.error.next(customMessage);
return throwError(error);
}
encodeBase64(value: any) {
return btoa(JSON.stringify(value));
}
decodeBase64(value: any) {
return atob(value);
}
navigateToDefaultPage(usersRole: Role) {
if (usersRole === Role.Employee) {
this.router.navigate(['/dashboardNavigation', {outlets: {dashNav: ['productionDashboard']}}]);
} else if (usersRole === Role.Client) {
this.router.navigate(['/clientDashboard']);
} else if (usersRole === Role.OfficeAdmin) {
this.router.navigate(['/dashboardNavigation', {outlets: {dashNav: ['enterpriseDashboard']}}]);
} else {
this.router.navigate(['/auth']);
}
}
validateEmail(inputText: string) {
const mailFormat = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/;
if (inputText.match(mailFormat)) {
return true;
} else {
return false;
}
}
}
Run Code Online (Sandbox Code Playgroud)
mockUtils.ts
import Utils from "../shared/utils";
import {Subject} from "rxjs";
export class MockUtils extends Utils {
error = new Subject<string>();
}
Run Code Online (Sandbox Code Playgroud)
基本上我需要帮助设置测试页面的结构,以便我可以开始编写有用的测试。
我可以提供您可能需要帮助的任何其他代码,但不确定这需要什么。
删除fixture.detectChanges()从beforeEach方法,从那里删除它,并将其移入如果需要,将修复它为你的每个测试,我认为这是一个错误,看到它的角6和7角
所以你 beforeEach 将更改为:
beforeEach(async(() => {
const mockTranslate = new MockTranslateService(TRANSLATIONS);
TestBed.configureTestingModule({
imports: [
RouterTestingModule
],
declarations: [
AppComponent
],
providers: [
{provide: TranslateService, useValue: mockTranslate},
{provide: Utils, useValue: MockUtils},
]
});
fixture = TestBed.createComponent(AppComponent);
// detection deleted here
}));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4105 次 |
| 最近记录: |