【发布时间】:2020-06-30 06:11:47
【问题描述】:
我是 Angular 的初学者。我正在努力学习 Typescript,现在我被告知要为我创建的每个 component 和 service 编写 Jasmine 和 Karma 单元测试用例。我看过很多教程来学习Angular 中的单元测试。我是一名实习生,昨天我提出了一个拉取请求,我的技术负责人对此发表了以下评论。
这是我写的代码。
filter-bar.component.ts
import { Component, OnInit, ViewChild, OnDestroy, Input, ChangeDetectorRef } from '@angular/core';
import './filter-bar.component.scss';
import { SisenseService } from '../services/sinsense.service';
import { SisenseConfigService } from '../services/sinsense-config.service';
import { Dashboard, Widget } from 'src/app/shared/models/sisenseConfig';
...
@Component({
selector: 'app-filter-bar',
templateUrl: './filter-bar.component.html'
})
export class FilterBarComponent implements OnInit, OnDestroy {
selectedMembersCount: number;
dataUnavailable: boolean;
constructor(
public sisenseService: SisenseService,
public sisenseConfigService: SisenseConfigService
) {}
ngOnInit() {
this.getDataFromWidget();
}
getDataFromWidget() {
this.sisenseService.getWidgetData(
this.sisenseConfigService.getDashboardId(Dashboard.POPULATION),
this.sisenseConfigService.getWidgetInfo(Dashboard.POPULATION, Widget.UNIQUE_LIVES).id,
widgetData => {
this.selectedMembersCount = widgetData.queryResult.value.data;
this.changeDetector.detectChanges();
},
() => {
this.dataUnavailable = true;
}
);
}
}
这是我编写的规范文件:
filter-bar.component.spec.ts
import { async, ComponentFixture, TestBed, fakeAsync, tick } from '@angular/core/testing';
import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { FilterBarComponent } from './filter-bar.component';
import { SisenseFilterService } from '../services/sinsense-filter.service';
import { PopUpService } from '@wuitk6/angular/components/popup/popup.service';
import { SisenseService } from '../services/sinsense.service';
import { SisenseConfigService } from '../services/sinsense-config.service';
describe('FilterPanelComponent', () => {
let component: FilterBarComponent;
let fixture: ComponentFixture<FilterBarComponent>;
mockSisenseConfigService.getWidgetInfo.and.returnValue({ id: 'demo_ID' });
fixture = TestBed.createComponent(FilterBarComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
});
这是服务,(我不知道谁写了这段代码):
sisense-config.service.ts
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import 'rxjs/add/operator/do';
...
import { ErrorService } from './error.service';
// This is to avoid compile errors in typescript.
// The real variable will be added when sisense.js is loaded
declare var Sisense: any;
@Injectable({
providedIn: 'root'
})
export class SisenseConfigService {
constructor(private http: HttpClient, private errorService: ErrorService) {}
getDashboardId(dashboardName: string): string {
...
}
getWidgetInfo(dashboardName: string, widgetName: string): ISisenseWidget {
...
return widgetInfo;
}
}
我已经编写了测试文件,但她不同意。请帮助我我的技术负责人到底要求什么。欢迎询问更多代码详情。
【问题讨论】:
-
为什么要使用 for 循环而不是 forEach?
-
好的。我会成功的
forEach。 -
我会帮助你,但我在阅读
getDataFromWidget函数时遇到了困难。我建议你上这门课,这太棒了,你会以一种很好的方式学习 Angular 单元测试。 app.pluralsight.com/library/courses/unit-testing-angular/…。创建免费试用版。 -
@AliF50,我只关注这个。我正在关注 Joe Eames 的 AAA 测试概念和 Deborah Kurata 的一些讲座。顺便说一句,我已经购买了 1 年的订阅。 :-)
-
@Tanzeel 看看我的回答,如果有帮助请告诉我/
标签: angular typescript unit-testing karma-jasmine angular-test