如何测试我的方法是否在angular2中抛出一个可观察错误

How to test if my method throws an observable error in angular2?

本文关键字:一个 观察 错误 测试 何测试 我的 方法 是否 angular2      更新时间:2023-09-26

我正在为我的angular2组件创建单元测试用例。

到目前为止,测试用例运行正常。

但是我正面临异步调用的问题。

例如,我有以下创建新用户的方法,如果用户已经存在,则抛出错误:

onSubmit():Observable<any> {  
    this._userService.saveUser(this.user).subscribe(
        (response) => {
          this._directoryService.getDirectoryById(this.selectedDirectory._id).subscribe(
            (directory) => {                        
              this.users = directory[0].users;
            },
            (error) => {              
              return error;              
            }
          );
        },
        (error) => {                   
          return error;         
        }
     );
    return ;
}

在我的服务中,我使用以下方法抛出了一个错误:

if (alreadyExist) {
        let error = "user already exist in database";
        return Observable.throw(error);
}

现在我希望这个方法抛出一个错误:

expect( function(){ app.onSubmit(); } )
    .toThrow(new Error("User already exist in database"));

现在从我的理解,这个测试用例应该是成功的,但我得到以下错误后,我的测试用例失败:

期望函数抛出异常。

我尝试了多个期望块:

expect(app.onSubmit()).toThrowError(new Error("User already exist in database"));

但仍然没有取得任何成功。

输入吗?

谢谢

关于Observable.throw的事情是它实际上不会抛出任何错误。即使有,也会在内部处理。expect().toThrowError只捕获未处理的异常,这些异常会冒泡到测试中。

Observable.throw所做的是将错误传递给onError回调。所以你应该做的是订阅调用,并检查回调

中的错误
it('..', async(() => {
  app.onSubmit().subscribe(
    () => {
      fail('expected error');
    },
    (error) => {
      expect(error).toBe('user already exist in database');
    });
}))