Aus*_*orn 3 unit-testing jasmine angular angular-test
我有一个简单的单元测试,它是在 Angular 6 组件上使用 karma/jasmine 完成的。从我收集的复数课程和文档来看,我似乎正在正确地模拟我的组件所需的服务,但是当调用该方法从模拟服务返回数据时,我收到错误消息,指出属性订阅未定义。
我的“it”函数是空的,因为一旦在 beforeEach 方法中构造了组件,测试就会失败。组件的构造函数调用了我试图测试的方法。请在下面查看我的代码。
import { TestBed, async, ComponentFixture } from '@angular/core/testing';
import { MainComponent } from './main.component';
import { DataService } from '../services/data.service';
import { of } from 'rxjs';
import { NO_ERRORS_SCHEMA } from "@angular/core";
describe('Should construct MainComponent', () => {
let mainComponent: MainComponent;
let EMPLOYEES;
let fixture: ComponentFixture<MainComponent>;
let mockDataService;
beforeEach(() => {
EMPLOYEES = [
{
"PrismEmployeeID": 1,
"FirstName": "install2",
"LastName": "account",
"Initials": "IA ",
"NickName": "",
"SSN": "",
"DateOfBirth": "09/26/2014",
"HireDate": "09/26/2014",
"OfficePhone": "9043943239",
"OfficeFax": "9042246400",
"ClassificationID": 133,
"ClassificationDescription": "Claims Support U.S. Insurance",
"SupervisorID": 32,
"DepartmentID": 2,
"DepartmentDescription": "Information Technology",
"SupervisorName": "Jerry Sutton",
"CountryID": 1,
"CountryName": "United States"
}
];
mockDataService = jasmine.createSpyObj(['GetEmployees']);
TestBed.configureTestingModule({
declarations: [MainComponent],
providers: [{ provide: DataService, useValue: mockDataService }],
schemas: [NO_ERRORS_SCHEMA]
});
fixture = TestBed.createComponent(MainComponent);
fixture.detectChanges();
mockDataService = jasmine.createSpyObj(['GetEmployees']);
});
it('should get an array Employees',
() => {});
});Run Code Online (Sandbox Code Playgroud)
主组件
import { Component, Input, Output, OnInit, EventEmitter } from '@angular/core';
import { DataService } from '../services/data.service';
import { TableComponent } from './table/table.component';
@Component({
selector: 'main',
templateUrl: './main.component.html',
styleUrls: ['./main.component.css']
})
export class MainComponent {
columns: string[] = ['PrismEmployeeID', 'LastName', 'FirstName', 'Initials', 'LastFour', 'BirthDate', 'HireDate', 'OfficePhone', 'OfficeFax', 'ClassificationDescription', 'SupervisorName', 'DepartmentDescription', 'CountryName'];
loading: boolean = false;
@Input() tableData: Employee[];
constructor(private _dataService: DataService) {
this.loadEmployees();
}
loadEmployees() {
this.loading = true;
this._dataService.GetEmployees().subscribe((data) => {
this.loading = false;
this.tableData = data.json() as Employee[];
});
}
onLoading(loading: boolean) {
this.loading = loading;
}
onReloadData(reloadData: boolean) {
this.loadEmployees();
}
}
interface Employee {
PrismEmployeeID: number;
FirstName: string;
LastName: string;
Initials: string;
NickName: string;
SSN: string;
DateOfBirth: string;
HireDate: string;
OfficePhone: string;
OfficeFax: string;
ClassificationID: number;
ClassificationDescription: string;
SupervisorID: number;
DepartmentID: number;
DepartmentDescription: string;
SupervisorName: string;
CountryID: number;
CountryName: string;
_selected: boolean;
}Run Code Online (Sandbox Code Playgroud)
<br/>
<h2>Prism Employees</h2>
<div *ngIf="loading" class="d-flex justify-content-center bd-highlight mb-3">
<div class="p-2 bd-highlight"></div>
<div class="p-2 bd-highlight">
<mat-spinner id="overlay"></mat-spinner>
</div>
<div class="p-2 bd-highlight"></div>
</div>
<div *ngIf='tableData'>
<table-component #table (loading)="onLoading($event)" (reloadData)="onReloadData($event)" [data]="tableData" [displayedColumns]="columns"></table-component>
</div>Run Code Online (Sandbox Code Playgroud)
问题是您当前提供的服务存根没有为该GetEmployees方法配置返回值。这意味着一旦组件调用前一个函数并订阅其(未定义的)返回,它将触发异常。
要解决这个问题,您需要伪造该方法的返回值。根据此答案,您可以按如下方式尝试:
import {of} from 'rxjs';
...
mockDataService = jasmine.createSpyObj(DataService.Name, {'GetEmployees': of(EMPLOYEES)});
...
Run Code Online (Sandbox Code Playgroud)
更新:
但是,为了使其工作,您必须重构您的DataService.GetEmployees方法以具有以下签名:
GetEmployees(): Observable<Employee[]>;
Run Code Online (Sandbox Code Playgroud)
的当前实现DataService.GetEmployees是一个有漏洞的抽象,因为它Response从旧HttpAPI返回原始对象,迫使使用者(在本例中为组件)了解有关底层实现的详细信息(此详细信息是 的使用data.json() as Employee[])
| 归档时间: |
|
| 查看次数: |
12066 次 |
| 最近记录: |