无法在单元测试中验证 JSON 的结构,并且结果与预期结果不匹配



我正在尝试为收到http.post的响应时调用的函数运行unit test

handleSuccessResponseForUserProfileRequest(res: HttpSentEvent|HttpHeaderResponse|HttpResponse<any>|HttpProgressEvent|HttpUserEvent<any>) {
const ev = <HttpEvent<any>>(res);
if (ev.type === HttpEventType.Response) {
console.log('response from server: body ',ev.body);
const isResponseStructureOK: boolean = this.helper.validateServerResponseStructure(ev.body);
if (isResponseStructureOK) {
const response: ServerResponseAPI = ev.body;
this.userProfileSubject.next(new Result(response.result, response['additional-info']));
} else {
this.userProfileSubject.next(new Result('error', 'Invalid response structure from server'));
}
} else {
}
}

validateServerResponseStructure检查响应的结构是否正常。它应该具有resultadditional-info密钥

validateServerResponseStructure(res: any): boolean {
const keys = Object.keys(res);
const isTypeCorrect: boolean = (
['result', 'additional-info'].every(key => keys.includes(key))
&& keys.length === 2);
return isTypeCorrect;
}

我写的单元案例是

fit('should return if user information isn't stored', () => {
const body = JSON.stringify({"result":"success", "additional-info":"some additional info"});
const receivedHttpEvent = new HttpResponse({body:body});
const userService: UserManagementService = TestBed.get(UserManagementService);
const helperService:HelperService = TestBed.get(HelperService);
spyOn(userService['userProfileSubject'],'next');
//spyOn(helperService,'validateServerResponseStructure').and.returnValue(true);
userService.handleSuccessResponseForUserProfileRequest(receivedHttpEvent);
const expectedResult = new Result('success', 'some additional info');
expect(userService['userProfileSubject'].next).toHaveBeenCalledWith(expectedResult);
});

如果我在validateServerResponseStructure上没有spy,那么我的测试用例就会失败,因为validateServerResponseStructure失败了,尽管在我看来结构还可以

Expected spy next to have been called with [ Result({ result: 'success', additionalInfo: 'some additional info' }) ] but actual calls were [ Result({ result: 'error', additionalInfo: 'Invalid response structure from server' }) ].

如果我监视validateServerResponseStructure并返回true,那么我会得到错误

Expected spy next to have been called with [ Result({ result: 'success', additionalInfo: 'some additional info' }) ] but actual calls were [ Result({ result: undefined, additionalInfo: undefined }) ].

有趣的是,如果我加上下面的两张照片,它们会显示不同的值!!

console.log('extracted response ',response);
console.log('sending response '+response.result + 'and additional info' +response['additional-info']);

我看到

extracted response  {"result":"success","additional-info":"some additional info"}
sending response undefined and additional info undefined

我做错了什么?

有趣的是,如果我在单元测试中将httpResponse中的type<T>更改为Object而不是string,代码就会工作。

const body = {"result":"success", "additional-info":"some additional info"};
const receivedHttpEvent = new HttpResponse({body:body});

最新更新