如何 运行 在 angular 服务中对 toast 消息进行单元测试?
How to run unit test case for toast message in angular service?
我正在使用基于 Angular 12. I have service called notification
service which handles toast messages from ngx-toastr 库的应用程序。
这是该服务的样子:
export class NotificationService {
constructor(private toastr: ToastrService) {}
showSuccess(message: string = 'Success ', note: string = ''): void {
this.toastr.success(message, note);
}
showError(message: string = 'Error ', note: string = 'Try again'): void {
this.toastr.error(message, note, {
timeOut: 3000,
});
}
}
服务方法运行良好,但是当我尝试为它们实施测试时出现以下错误:
NotificationService should test "showSuccess" method FAILED
Error: <spyOn> : could not find an object to spy upon for success()
这些是测试:
describe('NotificationService', () => {
let notificationService: NotificationService,
httpTestingController: HttpTestingController,
toastrService: ToastrService,
notificationServiceSpy: any;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [CommonModule, HttpClientTestingModule, ToastrModule.forRoot()],
declarations: [],
providers: [{ provide: ToastrService, useValue: toastrService }],
}).compileComponents();
notificationService = TestBed.inject(NotificationService);
httpTestingController = TestBed.inject(HttpTestingController);
toastrService = TestBed.inject(ToastrService);
});
it('should be created', () => {
expect(notificationService).toBeTruthy();
});
it('should test "showSuccess" method', () => {
spyOn(toastrService, 'success').and.callThrough();
});
afterEach(() => {
httpTestingController.verify();
});
});
感谢任何帮助。谢谢!
您收到该消息是因为当您这样做时:
providers: [{ provide: ToastrService, useValue: toastrService }],
在那个时间点,toastrService
未定义,然后当您执行 spyOn(toastrService, 'success');
时,由于 toastrService
未定义,因此无法监视成功方法。
我会嘲笑toastrService
。
进行以下更改,注意以 !!
.
开头的行
describe('NotificationService', () => {
let notificationService: NotificationService,
httpTestingController: HttpTestingController,
// !! change this line to this
toastrService: jasmine.SpyObj<ToastrService>,
notificationServiceSpy: any;
beforeEach(async () => {
// !! add a new spy object before each test, now toastrService is not undefined
toastrService = jasmine.createSpyObj<ToastrService>('ToasterService', ['error', 'success']);
await TestBed.configureTestingModule({
imports: [CommonModule, HttpClientTestingModule, ToastrModule.forRoot()],
declarations: [],
providers: [
// !! provide NotificationService to the TestBed module because it is under test
NotificationService,
{ provide: ToastrService, useValue: toastrService }],
}).compileComponents();
notificationService = TestBed.inject(NotificationService);
httpTestingController = TestBed.inject(HttpTestingController);
// !! don't need the below line, we already have access to the spy object
// toastrService = TestBed.inject(ToastrService);
});
it('should be created', () => {
expect(notificationService).toBeTruthy();
});
it('should test "showSuccess" method', () => {
// !! you should not spyOn this anymore, toastrService has methods error
// and success now which are both spies.
// spyOn(toastrService, 'success').and.callThrough();
// !! call the method
service.showSuccess('hello world', 'hello');
expect(toastrService.success).toHaveBeenCalledWith('hello world', 'hello');
});
afterEach(() => {
httpTestingController.verify();
});
});
我正在使用基于 Angular 12. I have service called notification
service which handles toast messages from ngx-toastr 库的应用程序。
这是该服务的样子:
export class NotificationService {
constructor(private toastr: ToastrService) {}
showSuccess(message: string = 'Success ', note: string = ''): void {
this.toastr.success(message, note);
}
showError(message: string = 'Error ', note: string = 'Try again'): void {
this.toastr.error(message, note, {
timeOut: 3000,
});
}
}
服务方法运行良好,但是当我尝试为它们实施测试时出现以下错误:
NotificationService should test "showSuccess" method FAILED
Error: <spyOn> : could not find an object to spy upon for success()
这些是测试:
describe('NotificationService', () => {
let notificationService: NotificationService,
httpTestingController: HttpTestingController,
toastrService: ToastrService,
notificationServiceSpy: any;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [CommonModule, HttpClientTestingModule, ToastrModule.forRoot()],
declarations: [],
providers: [{ provide: ToastrService, useValue: toastrService }],
}).compileComponents();
notificationService = TestBed.inject(NotificationService);
httpTestingController = TestBed.inject(HttpTestingController);
toastrService = TestBed.inject(ToastrService);
});
it('should be created', () => {
expect(notificationService).toBeTruthy();
});
it('should test "showSuccess" method', () => {
spyOn(toastrService, 'success').and.callThrough();
});
afterEach(() => {
httpTestingController.verify();
});
});
感谢任何帮助。谢谢!
您收到该消息是因为当您这样做时:
providers: [{ provide: ToastrService, useValue: toastrService }],
在那个时间点,toastrService
未定义,然后当您执行 spyOn(toastrService, 'success');
时,由于 toastrService
未定义,因此无法监视成功方法。
我会嘲笑toastrService
。
进行以下更改,注意以 !!
.
describe('NotificationService', () => {
let notificationService: NotificationService,
httpTestingController: HttpTestingController,
// !! change this line to this
toastrService: jasmine.SpyObj<ToastrService>,
notificationServiceSpy: any;
beforeEach(async () => {
// !! add a new spy object before each test, now toastrService is not undefined
toastrService = jasmine.createSpyObj<ToastrService>('ToasterService', ['error', 'success']);
await TestBed.configureTestingModule({
imports: [CommonModule, HttpClientTestingModule, ToastrModule.forRoot()],
declarations: [],
providers: [
// !! provide NotificationService to the TestBed module because it is under test
NotificationService,
{ provide: ToastrService, useValue: toastrService }],
}).compileComponents();
notificationService = TestBed.inject(NotificationService);
httpTestingController = TestBed.inject(HttpTestingController);
// !! don't need the below line, we already have access to the spy object
// toastrService = TestBed.inject(ToastrService);
});
it('should be created', () => {
expect(notificationService).toBeTruthy();
});
it('should test "showSuccess" method', () => {
// !! you should not spyOn this anymore, toastrService has methods error
// and success now which are both spies.
// spyOn(toastrService, 'success').and.callThrough();
// !! call the method
service.showSuccess('hello world', 'hello');
expect(toastrService.success).toHaveBeenCalledWith('hello world', 'hello');
});
afterEach(() => {
httpTestingController.verify();
});
});