单元测试时“无法读取未定义的属性‘长度’”
2020-04-20
9804
我正在对从服务器呈现代码列表的组件进行单元测试。
响应的格式如下:
{
ContactActivityView :[
{
Code:"AB",
IsActive:false,
},
{
Code:"BC",
IsActive:true,
}
..
...
]
}
在我的 component.ts 文件中,我按以下方式使用它:
codesArray: ICodeModel[];
ngOnInit() {
this.getCodes();
}
getCodes() {
this.service.getCodes()
.subscribe((response: ICodeModel[] | []) => {
this.codesArray = response['ContactActivityView'];
},
error => console.log(error)
);
}
它工作正常,我能够使用 component.html 文件显示我的数据:
..
...
<div class="message" *ngIf="codesArray.length === 0">
No Data Found.
</div>
<div class="tbl-row" *ngFor="let code of codesArray">
<div class="item">
{{ code.Code }}
</div>
<div class="item">
{{ code.IsActive }}
</div>
..
...
component.service 文件:
..
...
getCodes(): Observable<ICodeModel[]> {
return this._service.get(this.codeURL);
}
..
...
现在,当我运行我的 component.spec 文件时,它给出了一个错误:
TypeError: Cannot read property 'length' of undefined
我意识到在 .html 中我的
codesArray
是
undefined
,因此长度是
undefined
。
我
console
我的
codesArray
。它在 comp.ts 文件中显示数据,但在 comp.spec 文件中显示
undefined
不确定我做错了什么,因为我能够正确呈现数据,但不知何故我的测试失败了。 这是我的 component.spec 文件
..
...
class MockCodesService {
getCodes(): Observable<ICodeModel[]> {
return of([]);
}
addCode(param: ICodeModel){
return of({});
}
updateCode(param: ICodeModel) {
return of({});
}
}
describe('CodesComponent', () => {
let component: CodesComponent;
let fixture: ComponentFixture<CodesComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [
CodesComponent
],
providers: [
{ provide: CommonCrudService, useClass: CommonCrudMockService },
{ provide: MessageService, useClass: MessageMockService },
{ provide: AppService, useClass: AppMockService },
{ provide: CodesService, useClass: MockCodesService }
],
schemas: [NO_ERRORS_SCHEMA]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(CodesComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
谢谢。
2个回答
在
MockCodesService
中,
getCodes()
从数组中返回一个可观察对象,但在您的组件中,
this.service.getCodes()
需要从具有
ContactActivityView
属性的对象中获取一个可观察对象。尝试在
MockCodesService
中执行类似操作:
getCodes(): Observable<ICodeModel[]> {
return of({
ContactActivityView :[
{
Code:"AB",
IsActive:false,
},
{
Code:"BC",
IsActive:true,
}]
});
}
alexortizl
2020-04-20
您需要在 component.ts 文件中初始化 codesArrays=[]
codesArray: ICodeModel[] = [];
因此,在您的 html 文件中
<div class="message" *ngIf="codesArray.length === 0">
codesArray.length
不会未定义。
Captain America
2023-11-21