可观察的单元测试在应该失败的时候通过了
Observable unit test passing when it should be failing
rxjs 和 angular 的新手,尝试为具有成功/错误场景的简单 rxjs observable 编写一些基本单元测试:
服务方式:
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
似乎问题是 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
rxjs 和 angular 的新手,尝试为具有成功/错误场景的简单 rxjs observable 编写一些基本单元测试:
服务方式:
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
似乎问题是 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