worldint
mathengi
worldint
전체 방문자
오늘
어제
  • 분류 전체보기 (152)
    • infra, cloud (4)
      • aws (4)
    • TIL,WIL(일간,주간 회고) (57)
    • 컴퓨터 공학 (5)
      • 정보통신 (3)
      • 컴퓨터 구조 (2)
    • Math (1)
      • linear algebra (0)
      • 명제와 집합 (1)
    • Operating System (8)
      • Linux Ubuntu (1)
    • programming (66)
      • c , c++ (9)
      • c# (0)
      • java (2)
      • javascript (14)
      • Python (4)
      • github (1)
      • programing terms (12)
      • html, css (2)
      • docker (3)
      • algorithm_datastructure (5)
      • database (11)
      • flutter(dart) (2)
    • 항해99 부트캠프 (7)
      • 사전교육 (7)
    • 보안관련 (1)

블로그 메뉴

    공지사항

    인기 글

    태그

    • Javascript
    • Blue/Green
    • nodejs
    • NVM
    • EC2
    • flutter #provider #error
    • AWS
    • node
    • ec2 #코드디플로이 #리눅스
    • NoSQL
    • MONGOOSE
    • 디비데드락
    • ci/cd
    • docker
    • CloudFront
    • db데드락
    • MongoDB

    최근 댓글

    최근 글

    티스토리

    hELLO · Designed By 정상우.
    worldint

    mathengi

    programming/javascript

    [rxjs] rxjs의 테스트 코드 작성(미완성)

    2023. 5. 25. 17:49

    옵저버블 객체를 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
      'programming/javascript' 카테고리의 다른 글
      • [typescript] typeof, keyof
      • [rxjs 용어 정리] hot, cold Observable
      • [typescript] 클래스 선언 방법
      • [typescript] inject,injectable데코레이터 토큰 ,프로바이더
      worldint
      worldint
      공부한 내용들, 트러블 슈팅 용 블로그

      티스토리툴바