【问题标题】:Observable unit test passing when it should be failing可观察的单元测试在它应该失败时通过
【发布时间】:2019-07-16 09:07:07
【问题描述】:

rxjs 和 Angular 的新手,尝试为一个简单的 rxjs 可观察的成功/错误场景编写一些基本的单元测试:

服务方式:

export class MyService {

    constructor(private http: HttpClient) {}

    public getId(id) {
        return this.http.get('www.myurl.com/' + id, {
            withCredential: true,
            responseType: 'json' as 'json'
        })
        .pipe(
            map(response => {
                return response;
            }),
            catchError(() => {
                return 'Service returned error';
            })
        };
    }
}

测试:

it('should throw an error',() => {
    spyOn(httpClientMock, 'get').and.returnValue(Observable.throw('error));

    myService.getId('test1')
        .subscribe(
            () => {},
            error => {
                expect(error).toEqual('Service returned error');
            }
        };
});

但是,如果我将期望语句更改为:

expect(error).toEqual('Service returned erro');

单元测试仍然通过。

如果我退出错误,我会看到:

S
e
r
v
i
c
e

r
e
t
u
r
n
e
d

e
r
r
o
r

【问题讨论】:

    标签: angular rxjs angular-unit-test


    【解决方案1】:

    似乎问题在于catchError 期望从回调 fn 返回一个 Observable,而不仅仅是一个值。试试

    import { of } from 'rxjs';
    
    // ...
    
    catchError(() => {
      return of('Service returned error');
    })
    

    在此处查看示例https://observable-playground.github.io/gist/aa4e24897f4fce150dd92a6fdb0f5929

    更新

    我刚刚意识到您主要关心的可能是通过测试。那么问题可能在于可观察对象的异步性质。你需要在你的测试中有一个回调来表明测试是异步的,并调用回调来标记执行完成。

    例如:

    it('should throw an error',(done) => {
        spyOn(httpClientMock, 'get').and.returnValue(Observable.throw('error));
    
        myService.getId('test1')
            .subscribe(
                () => {},
                error => {
                    expect(error).toEqual('Service returned error');
                },
                // We will call done when Observable completes
                () => done()
            };
    });
    

    这是一篇关于 Jasmine 和异步调用的文章:

    https://medium.com/dailyjs/unit-testing-async-calls-and-promises-with-jasmine-a20a5d7f051e

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多