所以,我正在为Angular应用程序编写单元测试。我有这个errorHandlerService,带有一个handle()函数,它接收一个String或一个Error类,处理它,最后根据错误类型打开一个包含不同消息的snackBar。
错误handler.service.ts
@Injectable({
providedIn: 'root'
})
export class ErrorHandlerService {
constructor(
public snackBar: MatSnackBar
) { }
handle(errorResponse: any) {
let msg: string;
if (typeof errorResponse === 'string') {
msg = errorResponse;
} else if (errorResponse instanceof HttpErrorResponse
&& errorResponse.status >= 400 && errorResponse.status <= 499) {
msg = 'Error processing your request.';
if (errorResponse.status === 403) {
msg = 'You're not allowed to execute this action.';
}
console.error('Error occurred', errorResponse);
} else {
msg = 'Error processing remote service. Try again later.';
console.error('Error occurred', errorResponse);
}
this.snackBar.open(msg);
}
}
我的测试方法只是评估snackBar是否打开,考虑到它将会发生。但是我怎么能这样做呢?这是我的.spec.ts文件
错误handler.service.spec.ts
describe('ErrorHandlerService', () => {
beforeEach(() => TestBed.configureTestingModule({
imports: [RouterTestingModule],
providers: [
{ provide: MatSnackBar, useValue: {} }
]
}));
it('should be created', () => {
const service: ErrorHandlerService = TestBed.get(ErrorHandlerService);
expect(service).toBeTruthy();
});
it('should call handle function and check snackBar occurrence', () => {
const service: ErrorHandlerService = TestBed.get(ErrorHandlerService);
service.handle('testing error');
expect(service.snackBar.open).toHaveBeenCalled();
});
});
我感谢任何帮助。谢谢
首先,我将在beforeEach
上面声明服务并在其中初始化它:
let service: ErrorhandlerService;
beforeEach(() => {.... service = TestBet.get(ErrorHandlerService); })
我会这样做:
let spy = spyOn(service.snackBar, "open")
service.handle(msg);
然后期待:
(spy).toHaveBeenCalledWith(msg)
建议:我会在其中加入一些特定的名称。像Service_MethodToTest_ExpectOpenToBeCalled
之类的东西。
感谢Robert Tab的帮助!它工作正常。我只需做一些调整,如下:
error-handler.service.ts(在文件的末尾)
this.callSnackBar(msg);
}
callSnackBar(msg: string) {
this.snackBar.open(msg);
}
在spec.ts文件中我做到了:
错误handler.service.spec.ts
beforeEach(() => {
service = TestBed.get(ErrorHandlerService);
});
...
it('should call handle function and check snackBar occurrence', () => {
const spy = spyOn(service, 'callSnackBar');
const msg = 'Service_MethodToTest_ExpectOpenToBeCalled';
service.handle(msg);
expect(spy).toHaveBeenCalledWith(msg);
});