SpyOn для одного метода, но несколько раз: ожидаемый шпион был вызван
Попытка шпионить один и тот же API из функции несколько раз. Но, случайно получил ошибку для разных тестовых случаев:
ОШИБКА:
HeaderComponent ChangePasswordModel
Error: Expected spy changePassword to have been called.
at <Jasmine>
at http://localhost:9876/_karma_webpack_/webpack:/src/app/shared/header/header.component.spec.ts:110:19
Error: Expected false to be truthy.
at <Jasmine>
at http://localhost:9876/_karma_webpack_/webpack:/src/app/shared/header/header.component.spec.ts:111:33
Некоторое время я получал ту же ошибку для других тестовых случаев.
Составная часть:
onSubmitSavePassword(changePasswordTemplate) {
this.submitted = true;
this.error = '';
if (!this.changePasswordForm.valid) {
return;
}
this.sharedService.changePassword(this.changePasswordForm.value)
.subscribe((res) => {
this.success = true;
}, err => {
this.error = '';
this.loading = false;
if (err && err.error && err.error.code) {
var errorCode = err.error.code;
this.changePasswordForm.controls['password'].setErrors( {invalid: true} );
this.changePasswordForm.controls['password'].setValue('');
this.changePasswordForm.controls['confirmPassword'].setErrors( {invalid: true} );
this.changePasswordForm.controls['confirmPassword'].setValue('');
switch (errorCode) {
case 4501: {
this.error = 'CHANGEPASSWORD.LBL_ERR_MSG_CURRENTPASSWORD';
break;
}
case 4401: {
this.error = 'RESET.ERR_MSG_MATCH_PASSWORD';
break;
}
case 4402: {
this.error = 'CHANGEPASSWORD.LBL_ERR_MSG_NEWPASSWORDNOTSAME';
break;
}
case 4405: {
this.error = 'RESET.ERR_MSG_MATCH_PASSWORD_CRITERIA';
break;
}
case 4010: {
this.closeModal();
break;
}
default: {
this.error = 'LOGIN.ERR_MSG_SERVER_ERROR';
break;
}
}
} else {
this.error = 'LOGIN.ERR_MSG_SERVER_ERROR';
}
});
}
спец.ц:
describe('ChangePasswordModel', () => {
beforeEach(() => {
component.openModal(undefined);
fixture.detectChanges();
fixture.whenStable().then(() => {
const password = component.changePasswordForm.controls['password'];
password.setValue('');
const confirmPassword = component.changePasswordForm.controls['confirmPassword'];
confirmPassword.setValue('');
const currentPassword = component.changePasswordForm.controls['currentPassword'];
currentPassword.setValue('');
});
});
it('Submit password invalid form', () => {
const spy = spyOn(component['sharedService'], 'changePassword').and.returnValue(undefined);
component.onSubmitSavePassword(undefined);
expect(spy).not.toHaveBeenCalled();
expect(component.submitted).toBeTruthy();
});
it('Submit password success.', () => {
const spy = spyOn(component['sharedService'], 'changePassword').and.returnValue(of({
code: 2001
}));
component.onSubmitSavePassword(undefined);
expect(spy).toHaveBeenCalled();
expect(component.success).toBeTruthy();
});
it('Submit password error 4501.', () => {
const spy = spyOn(component['sharedService'], 'changePassword').and.returnValue(rejectPromise({
error: {
code: 4501
}
}));
component.onSubmitSavePassword(undefined);
expect(spy).toHaveBeenCalled();
expect(component.changePasswordForm.valid).toBeFalsy();
expect(component.success).toBeFalsy();
});
it('Submit password error 4401.', () => {
const spy = spyOn(component['sharedService'], 'changePassword').and.returnValue(rejectPromise({
error: {
code: 4401
}
}));
component.onSubmitSavePassword(undefined);
expect(spy).toHaveBeenCalled();
expect(component.changePasswordForm.valid).toBeFalsy();
});
it('Submit password error 4402.', () => {
const spy = spyOn(component['sharedService'], 'changePassword').and.returnValue(rejectPromise({
error: {
code: 4402
}
}));
component.onSubmitSavePassword(undefined);
expect(spy).toHaveBeenCalled();
expect(component.changePasswordForm.valid).toBeFalsy();
expect(component.success).toBeFalsy();
});
it('Submit password error 4405.', () => {
const spy = spyOn(component['sharedService'], 'changePassword').and.returnValue(rejectPromise({
error: {
code: 4405
}
}));
component.onSubmitSavePassword(undefined);
expect(spy).toHaveBeenCalled();
expect(component.changePasswordForm.valid).toBeFalsy();
expect(component.success).toBeFalsy();
});
it('Submit password error 4010.', () => {
const spy = spyOn(component['sharedService'], 'changePassword').and.returnValue(rejectPromise({
error: { code: 4010 }
}));
component.onSubmitSavePassword(undefined);
expect(spy).toHaveBeenCalled();
});
it('Submit password error default message.', () => {
const spy = spyOn(component['sharedService'], 'changePassword').and.returnValue(rejectPromise({
error: {
code: 9999
}
}));
component.onSubmitSavePassword(undefined);
expect(spy).toHaveBeenCalled();
expect(component.changePasswordForm.valid).toBeFalsy();
expect(component.success).toBeFalsy();
});
it('Submit password error code not found.', () => {
const spy = spyOn(component['sharedService'], 'changePassword').and.returnValue(rejectPromise({}));
component.onSubmitSavePassword(undefined);
expect(spy).toHaveBeenCalled();
});
});