我正在尝试测试一个包含订阅的方法(refreshMemberList(((,但当我运行测试时,我从Karma那里得到了这个错误。有人能告诉我发生了什么事吗?提前非常感谢你,你是一个如此伟大的社区:D
Jasmine规范列表失败:
MemberListComponent > refreshMemberList refreshes members list
TypeError: Cannot read properties of undefined (reading 'subscribe')
member-list.component.ts:
describe('MemberListComponent', () => {
let component: MemberListComponent;
let fixture: ComponentFixture<MemberListComponent>;
let mockMemberListService: jasmine.SpyObj<MemberListService>;
let modalService: NgbModal;
beforeEach(async () => {
mockMemberListService = jasmine.createSpyObj(['getMembers']);
mockMemberListService.getMembers.and.returnValue(memberMockObject.fakeMemberListJSON);
await TestBed.configureTestingModule({
imports: [HttpClientTestingModule],
providers: [
{
provide: MemberListService,
useValue: mockMemberListService,
}
],
declarations: [MemberListComponent],
}).compileComponents();
});
beforeEach(() => {
fixture = TestBed.createComponent(MemberListComponent);
component = fixture.componentInstance;
modalService = TestBed.get(NgbModal);
});
it('refreshMemberList refreshes members list', () => {
component.refreshMemberList(memberMockObject.dataMemberMap);
fixture.detectChanges();
expect(component.members).toEqual(memberMockObject.fakeMembers);
});
});
member-list.component.ts:
export class MemberListComponent implements OnInit {
public title: String = "Members";
public showMemberDeletedAlert: Boolean;
private _memberListService: MemberListService;
public members: Member[] = [];
private dataMemberMap: Map<string, string>;
public page: number = 0;
public pageSize: number = 10;
public collectionSize: number;
public isLoading: boolean = true;
constructor(
memberListService: MemberListService,
private _modalService: NgbModal
) {
this._memberListService = memberListService;
}
ngOnInit(): void {
if(history.state.type==="delete")
this.showDeletedAlert()
this.dataMemberMap = new Map([
["name", ""],
["role", ""],
["skill", ""],
["skillLevel", ""],
["language", ""],
["languageLevel", ""]
]);
this.retrieveMemberList();
}
retrieveMemberList(): void {
this.isLoading = true;
this._memberListService.getMembers(this.dataMemberMap!, this.page, this.pageSize).subscribe((data) => {
this.members = data.memberList;
this.collectionSize = data.totalPages * this.pageSize;
this.isLoading = false;
});
}
refreshMemberList(dataMemberMap: Map<string, string>): void {
this.dataMemberMap = dataMemberMap;
this.retrieveMemberList();
}
}
为什么有MemberListService
类型的类属性?只需将依赖项注入用作
constructor(private memberListService: MemberListService) {}
然后将其用作:
...
this.memberListService.getMembers(...);
此外,在ngOnInit
生命周期挂钩中,所有这些逻辑从一开始就被触发了,这很好;这个组件的第一个测试应该是:
it('should create', () => {
expect(component).toBeTruthy();
});
这个测试(默认情况下是第一个测试(验证组件的成功创建,因此ngOnInit
中的任何逻辑都将被测试,其中一些逻辑正在调用getMembers
服务函数并发送3个参数,可能其中一些或全部是undefined
?
此外,我不知道memberMockObject
在您的测试文件中是什么,所以为了设置返回类型,我想说使用rxjs中的of
来创建observable
:
mockMemberListService.getMembers
.and.returnValue(of(yourDesiredValueHere));
它是未定义的,所以不能读取subscribe属性,因为你希望这个(_memberListService(是私有的,你可以在构造函数上使用(memberListService(作为私有的,而不使用_memberList Service,它有点像
constructor(
private memberListService: MemberListService,
private _modalService: NgbModal
) {}
当你调用getMembers时,你可以只使用this.memberListService.getMembers(...