text: import test from "tape";
  
  import { put, call } from "redux-saga/effects";
  import { delay } from "redux-saga";
  import { incrementAsync } from "./sagas";
  
  // incrementAsync 는 제너레이터 함수입니다. 이것을 실행하면, 이터레이터 오브젝트를 반환하고, 이터레이터의 next 메소드는 다음과 같은 모양을 가진 객체를 돌려줍니다.
  // gen.next() // => { done: boolean, value: any }
  // value 필드는 yield 된 표현식을 포함합니다. yield 다음 표현식의 결과 같은 것 말이죠. done 필드는 아직 yield 표현이 남아있는지, 아니면 제너레이터가 종료되었는지 가리킵니다.
  // gen.next() // => { done: false, value: <result of calling delay(1000)> }
  // gen.next() // => { done: false, value: <result of calling put({type: 'INCREMENT'})> }
  // gen.next() // => { done: true, value: undefined }
  
  test("incrementAsync Saga test", (assert) => {
      const gen = incrementAsync();
  
      // assert.deepEqual(
      //   gen.next(),
      //   { done: false, value: ??? },
      //   'incrementAsync should return a Promise that will resolve after 1 second'
      // )
  
      // now what
      // put 과 call 이 일반 객체를 반환하기 때문에, 테스트 코드에서 같은 함수들을 재사용할수 있게 되었고,
      // incrementAsync 의 로직을 테스트 하기 위해 단순히 제너레이터를 반복하고 값에 대해 deepEqual 테스트를 할 수 있게 되었습니다.
      assert.deepEqual(
          gen.next().value,
          call(delay, 1000),
          "incrementAsync Saga must call delay(1000)"
      );
  
      assert.deepEqual(
          gen.next().value,
          put({ type: "INCREMENT" }),
          "incrementAsync Saga must dispatch an INCREMENT action"
      );
  
      assert.deepEqual(
          gen.next(),
          { done: true, value: undefined },
          "incrementAsync Saga must be done"
      );
  
      assert.end();
  });
  