5-action-dispatch
save 후 스토어에게 fetch가 성공했다고 알려주는 action을 dispatch 해보자.
스토어는 dispatch
함수를 제너레이터에게 넘기면, 제너레이터는 이 함수를 fetch 응답 받은 후에 실행 할거임.
function* fetchProducts(dispatch) {
const products = yield call(Api.fetch, '/products');
dispatch({ type: 'PRODUCTS_RECEIVED', products })
}
이 방법은 제너레이터 내부에서 함수를 직접 호출하는 것과 비슷한 단점 가짐.
만약 fetchProducts가 응답값 받은 후에 dispatch 수행하는 것을 테스트하고 싶다면, dispatch 함수를 흉내내야함?
흉내내는 것 대신 declarative effect가 필요.
그저 dispatch는 미들웨어가 하도록 하자.
그럼 yield된 이펙트를 검사하고 정확한 명령이 포함되어있는지 확인만 하면 됨.
그래서 dispatch 이펙트를 생성하는 put
함수를 제공
function* fetchProducts() {
const products = yield call(Api.fetch, '/products');
// dispatch 이펙트를 생성하고 yield
yield put({ type: 'PRODUCT_RECEIVED', products })
}
여튼 dispatch를 PUT으로 대체한다는 거 같음?
제너레이터를 테스트 해보자.
const iterator = fetchProducts()
// expects a call instruction
assert.deepEqual(
iterator.next().value,
call(Api.fetch, '/products'),
"fetchProducts should yield an Effect call(Api.fetch, './products')"
)
// create a fake response
const products = {};
assert.deepEqual(
iterator.next(products).value,
put({ type: 'PRODUCTS_RECEIVED', products }),
"fetchProducts should yield an Effect put({ type: 'PRODUCTS_RECEIVED', products })"
)
Last updated
Was this helpful?