'Programming/SmallTalk'에 해당하는 글 14건

NgRx Effect에 withLatestFrom을 조합해서 사용하는 Production Code는 아주 잘 동작한다. 근데, 이걸 Effect에서 Unit Test와 MockStore를 조합해서 사용하면 동작하지 않는다. 그냥 undefined stream이라는 에러만 뱉어 낸다. 

 

구글링을 해도 실마리는 없고, 대충 여러 가지 글을 추정으로 다음과 같은 결론을 내렸다. 

 

withLatestFrom은 Observable이나 Array등을 입력으로 받는데, 이게 이미 초기화가 이루어져 있어야 한다. 초기화가 이루어져 있지 않으면 undefined stream이 된다. 즉, 현재 에러는 withLatestFrom의 source stream 들이 초기화가 이루어져 있지 않아 undefined stream 에러를 발생시키는 것으로 보인다.  

 

Production Code에서는 MockStore 등을 사용하지 않으므로, Store의 초기화, 각 Observable들의 초기화 등의 모든 게 이루어진 다음에 withLatestFrom의 Source Observable이 참조되는 것 같다. 

 

해결책은 Source Observable이 할당된 후, Effect를 생성시키면 된다. 아래 예는 동작하지만, isActive$를 testPolling$ 아래에 위치키는 순간 undefined stream 에러가 발생한다. 

 

export class RecentEventStoreEffects {
  isActive$ = this.facade.isActive$;
  
  testPolling$ = createEffect( () => this.actions$.pipe(
    ofType(RecentEventStoreActions.RecentEventStartPolling),
    withLatestFrom( this.isActive$ ),
    
    .................
    
  ));
  
  .....
  

WRITTEN BY
HanDDol
여행이란 건 말이지. 첫 걸음을 내딜 때는 모든 게 낯설고.. 그리고 점점 더 낯선 세상에 익숙해지면서 세상의 모든 곳이 고향처럼 느껴진다. 고향으로 돌아오는 여행의 마지막 걸음에는 나의 고향이 더 이상 익숙한 곳이 아닌 낯선 곳임을 알게 된다.

,

iif가 흔히들 생각하는 conditional statement라고 생각했는데 아니다. 

 

아래 예에서 언뜻 생각하기에는 input is arrived in 출력이 하나만 찍힐 것 같은데, 두 개가 찍힌다. 

iif는 조건문의 실행이 아니라, 리턴된 두 개의 stream 중 subscription만을 할 거냐 말거냐를 결정하는 거다. 

즉, "input is arrived in #1", "input is arrived in #2" 둘 다 찍히게 된다. 

 

import { of, pipe, iif } from 'rxjs';
import { mergeMap } from 'rxjs/operators';

const source$ = of('Input');
const one$ = (x) => {console.log(`${x} is arrived in #1`); return of('One')};
const two$ = (x) => {console.log(`${x} is arrived in #2`); return of('Two')};

source$.pipe(
  mergeMap(v =>
    iif(
      () => v === 'Input',
      one$(v),
      two$(v)
    ))
).subscribe( x => console.log('Output is ' + x ));

WRITTEN BY
HanDDol
여행이란 건 말이지. 첫 걸음을 내딜 때는 모든 게 낯설고.. 그리고 점점 더 낯선 세상에 익숙해지면서 세상의 모든 곳이 고향처럼 느껴진다. 고향으로 돌아오는 여행의 마지막 걸음에는 나의 고향이 더 이상 익숙한 곳이 아닌 낯선 곳임을 알게 된다.

,

Angular 테스팅에서 jest를 사용하는데, Marble Testing을 해야하기에 테스팅 툴을 찾았다. 

 

jasmine-marble 과 비슷하게 jest-marble이 있기에 아무 생각없이 올려서 사용하는데, Time Progression Syntax가 지원이 안 된다. 사용 방법을 찾다가 알게 된 거, jasmine-marble이고 jest-marble이고 간에 모두 rxjs testing 툴을 그냥 Wrapping한 거였다. ㅎㅎ 

 

그냥 rxjs의 기본 testing tool을 사용하면 될 걸 삽질 하고 있었다. 

 

Reference


WRITTEN BY
HanDDol
여행이란 건 말이지. 첫 걸음을 내딜 때는 모든 게 낯설고.. 그리고 점점 더 낯선 세상에 익숙해지면서 세상의 모든 곳이 고향처럼 느껴진다. 고향으로 돌아오는 여행의 마지막 걸음에는 나의 고향이 더 이상 익숙한 곳이 아닌 낯선 곳임을 알게 된다.

,
애플 무선 키보드를 하나 샀다. 뭐 맥 용으로 사용하려고 하는 건 아니고 윈도우 용으로 사용하기 위해서다. 어쨌든 붙이기 위해서 애러 사항 많군. 일단, 블루투스로 붙이는 건 아무 문제가 안되는데, 매핑이 문제다.

1. 블루 투스로 Paring하기

인터넷에서는 뭐가 잘 안 붙네 하는 것 같은 이야기가 많은데. 아마도 예전 블루투스 스택 문제인 걸로 보인다.
요즘 나오는 건 왠만하면 되는 걸로 보인다.
그래도 혹시 몰라 내가 사용한 건, Belkin의 미니 블루투스 동글이다. 거기 딸려 나온 블루투스 스택으로는 아주 잘 붙는다. 다만 다른 블루투스 장치와 연결되어 있을 때는 잘 안 붙는 것 같다. 물론 당연한 이야기겠지만.

2. 키 매핑하기

문제가 되는 건 키보드를 붙이는 게 아니라 키보드를 매핑하는 것 같다. 키보드 매핑 방법은 여러 가지가 존재한다.

A. BookCamp 의 애플 키보드 드라이버 사용
    - 이걸 사용해야 할 것 같은데, 왜인지 모르나 올라가질 않는다.
    - 블루투스 키보드로 올라가야 할 것 같은데, 올리면 비활성화된다.
    - 인터넷에 또는 AppleKeyboardInstaller.exe 같은 게 이런 부류다. 

B. KeyMapping 프로그램 활용
    - AutoKey, KeyTweak 같은 프로그램을 활용한다.
    - 가장 범용적이긴 하지만, 프로그래밍 하긴 귀찮다는 결론이다.

C. KeyMapping 프로그램을 애플 키보드에 커스터마이징한 프로그램
    - uawks, AppleWirelessKeyboardHelper 같은 프로그램
    - B의 장점에다, 귀찮니즘을 해결해주는 적절한 해결책일 듯
   
결국 C에 안착했다. 언젠가 A로 해결되길 바라면서.. 킬킬


WRITTEN BY
HanDDol
여행이란 건 말이지. 첫 걸음을 내딜 때는 모든 게 낯설고.. 그리고 점점 더 낯선 세상에 익숙해지면서 세상의 모든 곳이 고향처럼 느껴진다. 고향으로 돌아오는 여행의 마지막 걸음에는 나의 고향이 더 이상 익숙한 곳이 아닌 낯선 곳임을 알게 된다.

,