옵저버블 객체를 subscribe하는 코드에 대해 테스트코드를 작성할 때,
옵저버블 객체의 비동기적인 동작 때문에 subscribe()의 동작이 끝나기 전에 return을 시키는것으로 보인다
그래서 아래의 코드에서는 catch블럭으로 넘어갈 일이 없을 것 같다
export class Service {
---생략---
async func(req){
try {
const observable1$ = from(req.data).pipe(
mergeMap(async (data) => ({
await repository1.create(e)
}),
);
observable1$.subscribe({
next: async (data) => { await repository2.create(data) },
error: (e) => { throw e; },
});
return 'OK';
} catch (error) {
throw new InternalServerErrorException(error);
}
}
}
subscribe말고 lastValueFrom으로 observable1$의 작업이 다끝난뒤에
repository2.create()을 실행하는 방식으로 하면
observable에서 에러발생시 catch로 넘어간다
export class Service {
---생략---
async func(req){
try {
const observable1$ = from(req.data).pipe(
mergeMap(async (data) => ({
await repository1.create(e)
}),
);
const data = lastValueFrom(observable1$)
await repository2.create(data)
return 'OK';
} catch (error) {
throw new InternalServerErrorException(error);
}
}
}
* 이번에 해당했던 상황은 옵저버블에서 에러가 발생하나 테스트를 해야하는 상황이어서
subscribe방식일 때는 에러가 나와도 return "OK"를 먼저함
그래서 옵저버블에 대한 테스트가 안됐었음
service.func()를 테스트할때 옵저버블에서 에러가 나는것을 테스트해야하는데
옵저버블의 값을 받기도 전에 테스트가 종료된다
그래서 if문을 사용하여 test상황일 때는 lastValueFrom(observable1$)로 하여 테스트를 진행하고
product상황일때는 subscribe방식으로 진행함
test환경인지 아닌지에대한 판단은 jest전역객체에 값이 있나 없나로 확인
export class Service {
---생략---
async func(req){
try {
const observable1$ = from(req.data).pipe(
mergeMap(async (data) => ({
await repository1.create(e)
}),
);
if (jest !== undefined) { //jest테스트시에는 동기방식
const data = await lastValueFrom(observable1$)
await repository2.create(data)
} else{
observable1$.subscribe({
next: async (data) => { await repository2.create(data) },
error: (e) => { throw e; },
});
}
return 'OK';
} catch (error) {
throw new InternalServerErrorException(error);
}
}
}
convertSelector$.subscribe({ //실제 동작은 비동기
'programming > javascript' 카테고리의 다른 글
[typescript] typeof, keyof (0) | 2023.05.30 |
---|---|
[rxjs 용어 정리] hot, cold Observable (0) | 2023.05.25 |
[typescript] 클래스 선언 방법 (0) | 2023.04.23 |
[typescript] inject,injectable데코레이터 토큰 ,프로바이더 (0) | 2023.04.20 |
[typescript] ?: 구문 (0) | 2023.04.20 |