【问题标题】:How to test if my method throws an observable error in angular2?如何测试我的方法是否在 angular2 中引发了可观察到的错误?
【发布时间】:2017-03-06 03:41:29
【问题描述】:

我正在为我的 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"));

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

任何输入?

谢谢

【问题讨论】:

    标签: javascript angular jasmine angular2-testing


    【解决方案1】:

    Observable.throw 的特点是它实际上并没有抛出任何错误。即使有,也会在内部处理。 expect().toThrowError 仅捕获未处理且冒泡到测试的异常。

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

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

    【讨论】:

    • 试过这个......但它说我的实例变量之一是未定义的......我认为我已经将它初始化为 app.edit=false.error 是:cannot read property edit of undefined。 @peeskillet
    • 你能否发布一个完整的、最小的测试重现问题
    猜你喜欢
    • 2018-01-13
    • 2021-11-13
    • 1970-01-01
    • 2021-03-25
    • 1970-01-01
    • 2017-04-02
    • 2017-05-12
    • 2019-02-25
    • 1970-01-01
    相关资源
    最近更新 更多