在服务规范中测试snackBar发生

问题描述 投票:0回答:2

所以,我正在为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();
 });
});

我感谢任何帮助。谢谢

angular unit-testing jasmine
2个回答
0
投票

首先,我将在beforeEach上面声明服务并在其中初始化它:

 let service: ErrorhandlerService;
 beforeEach(() => {.... service = TestBet.get(ErrorHandlerService); })

我会这样做:

let spy = spyOn(service.snackBar, "open")

service.handle(msg);

然后期待:

(spy).toHaveBeenCalledWith(msg)

建议:我会在其中加入一些特定的名称。像Service_MethodToTest_ExpectOpenToBeCalled之类的东西。


0
投票

感谢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);
});
© www.soinside.com 2019 - 2024. All rights reserved.