Redux-saga рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреА рдореЗрдЯрд╛рдореЙрд░реНрдлреЛрд╕рд┐рд╕

redux-saga рдлреНрд░реЗрдорд╡рд░реНрдХ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рдкреИрдЯрд░реНрди рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди, рд╕рдЪреНрдЪреЗ рдЦреВрдиреА рдЙрджреНрдпрдо рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреА рддрд░рд╣, рд╣рдореЗрдВ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдкреВрд░реЗ рдХреЛрдб рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдЗрдП рдЬрд╛рдиреЗрдВ рдХрд┐ рд╣рдо рдЕрдкрдиреЗ рд╕рд╛рдЧреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХреИрд╕реЗ рдХрд░реЗрдВрдЧреЗред



рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдХреНрд▓рд┐рдХрд░ рдХреЛ рд▓реЗрдВред рдбреЗрдЯрд╛ рдкреНрд░рд╡рд╛рд╣ рдФрд░ рдЖрд╡реЗрджрди рдХрд╛ рдЕрд░реНрде рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛:

  1. рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рдмрдЯрди рджрдмрд╛рддрд╛ рд╣реИред
  2. рд╕рд░реНрд╡рд░ рдХреЛ рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдмрддрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдПрдХ рдмрдЯрди рджрдмрд╛рдпрд╛ рд╣реИред
  3. рд╕рд░реНрд╡рд░ рдХрд┐рдП рдЧрдП рдХреНрд▓рд┐рдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред
  4. рд░рд╛рдЬреНрдп рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рдХреНрд▓рд┐рдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд░рддрд╛ рд╣реИред
  5. UI рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреЗрдЦрддрд╛ рд╣реИ рдХрд┐ рдХреНрд▓рд┐рдХ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рд╣реБрдИ рд╣реИред
  6. ...
  7. рд▓рд╛рднред

рд╣рдорд╛рд░реЗ рдХрд╛рдо рдореЗрдВ, рд╣рдо рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╕рднреА рдЙрджрд╛рд╣рд░рдг рдЗрд╕ рднрд╛рд╖рд╛ рдореЗрдВ рд╣реЛрдВрдЧреЗред

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╢рд╛рдпрдж рдкрд╣рд▓реЗ рд╣реА рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рдЪреБрдХреЗ рд╣реИрдВ, рд╣рдо рдпрд╣ рд╕рдм redux-saga рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗред рдпрд╣рд╛рдБ рдкреВрд░реА рд╕рд╛рдЧрд╛ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╣реИ:

 export function* processClick() { const result = yield call(ServerApi.SendClick) yield put(Actions.clickSuccess(result)) } export function* watchClick() { yield takeEvery(ActionTypes.CLICK, processClick) } 

рдЗрд╕ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рдЧрд╛рдерд╛ processClick рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╕реАрдзреЗ рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЧрд╛рдерд╛ watchClick , рдЬреЛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг action' рд▓рд┐рдП рдПрдХ рд▓реВрдк рдмрдирд╛рддрд╛ рд╣реИред

рдЬрдирд░реЗрдЯрд░


рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЧрд╛рдерд╛ рд╣реИред рдпрд╣ рд╕рд░реНрд╡рд░ ( call) рд▓рд┐рдП рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬрддрд╛ рд╣реИ, рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ reducer ( put) ред рд╣рдореЗрдВ рдХрд┐рд╕реА рддрд░рд╣ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЧрд╛рдерд╛ рд╕рд░реНрд╡рд░ рд╕реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реА рд╣реИред рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╕рд░реНрд╡рд░ рдХреЙрд▓ рдХреЛ рд▓реЙрдХ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдФрд░ рдХрд┐рд╕реА рддрд░рд╣ рдЬрд╛рдВрдЪ рд▓реЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╕рд░реНрд╡рд░ рд╕реЗ рдЖрдпрд╛ рд░реАрдбреНрдпреВрд╕рд░ рдореЗрдВ рдЪрд▓рд╛ рдЧрдпрд╛ред

рдЪреВрдВрдХрд┐ рд╕рд╛рдЧрд╛ рдЬрдирд░реЗрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рд╣реИрдВ, next() рд╡рд┐рдзрд┐, рдЬреЛ рдЬрдирд░реЗрдЯрд░ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдореЗрдВ рд╣реИ, рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рд╕реНрдкрд╖реНрдЯ рддрд░реАрдХрд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЬрдирд░реЗрдЯрд░ рд╕реЗ рдЕрдЧрд▓рд╛ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рдЬрдирд░реЗрдЯрд░ рдХреЛ рдореВрд▓реНрдп рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдмреЙрдХреНрд╕ рд╕реЗ рдЧреАрд▓реЗ рдХреЙрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╕рдм рдХреБрдЫ рдЗрддрдирд╛ рд░рд╕рдкреВрд░реНрдг рд╣реИ? рдпрд╣рд╛рдБ рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╣реИ рдЬреЛ рдореИрдВрдиреЗ рдирдВрдЧреЗ рдЬрдирд░реЗрдЯрд░ рдкрд░ рд▓рд┐рдЦрд╛ рд╣реИ:

 it('should increment click counter (behaviour test)', () => { const saga = processClick() expect(saga.next().value).toEqual(call(ServerApi.SendClick)) expect(saga.next(10).value).toEqual(put(Actions.clickSuccess(10))) }) 

рдкрд░реАрдХреНрд╖рдг рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдХреНрдпрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реИ? рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдХреЗрд╡рд▓ рдЧрд╛рдерд╛ рд╡рд┐рдзрд┐ рдХреЗ рдХреЛрдб рдХреЛ рджреЛрд╣рд░рд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдЧрд╛рдерд╛ рдореЗрдВ рдХрд┐рд╕реА рднреА рдкрд░рд┐рд╡рд░реНрддрди рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред

рдРрд╕рд╛ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдорджрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

Redux-рдЧрд╛рдерд╛ рдкрд░реАрдХреНрд╖рдг рдпреЛрдЬрдирд╛


рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдордиреЗ рдЗрд╕реЗ рдЧреВрдЧрд▓ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдФрд░ рдЕрдЪрд╛рдирдХ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдХрд┐ рд╣рдо рдкрд╣рд▓реЗ рд╡рд╛рд▓реЗ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рджреВрд░ рдирд╣реАрдВ рдереЗред redux-saga рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рд╕реАрдзреЗ redux-saga рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдкреНрд░рд╢рдВрд╕рдХреЛрдВ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдП рдЧрдП рдХрдИ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рддреЗ рд╣реИрдВред

рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕реВрдЪреА рд╕реЗ рд╣рдордиреЗ redux-saga-test-plan рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рд▓рд┐рдпрд╛ред рдпрд╣рд╛рдБ рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рд╕рд╛рде рд▓рд┐рдЦреЗ рдЧрдП рдкрд░реАрдХреНрд╖рдг рдХреЗ рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдХреЛрдб рджрд┐рдпрд╛ рд╣реИ:

 it('should increment click counter (behaviour test with test-plan)', () => { return expectSaga(processClick) .provide([ call(ServerApi.SendClick), 2] ]) .dispatch(Actions.click()) .call(ServerApi.SendClick) .put(Actions.clickSuccess(2)) .run() }) 

expectSaga redux-saga-test-plan рдореЗрдВ рдЯреЗрд╕реНрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ expectSaga рдлрд╝рдВрдХреНрд╢рди, рдЬреЛ рдкрд░реАрдХреНрд╖рдг рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдкрд░реАрдХреНрд╖рдг рдЧрд╛рдерд╛ (рдкрд╣рд▓реА рд╕реВрдЪреА рд╕реЗ processClick ) рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ рд╣реА рдкрд╛рд╕ рд╣реЛ рдЬрд╛рддреА рд╣реИред

provide рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рд╕рд░реНрд╡рд░ рдХреЙрд▓ рдпрд╛ рдЕрдиреНрдп рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВред StaticProvider' рдХреА рдПрдХ рд╕рд░рдгреА StaticProvider' , рдЬреЛ рдмрддрд╛рддреА рд╣реИ рдХрд┐ рдХрд┐рд╕ рд╡рд┐рдзрд┐ рдХреЛ рд╡рд╛рдкрд╕ рд▓реМрдЯрдирд╛ рдЪрд╛рд╣рд┐рдПред

Act рдмреНрд▓реЙрдХ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдПрдХрд▓ рд╡рд┐рдзрд┐ рд╣реИ - dispatch ред рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рдЬрд╛рддреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЧрд╛рдерд╛ рдЬрд╡рд╛рдм рджреЗрдЧреАред

assert рдмреНрд▓реЙрдХ рдореЗрдВ call put рддрд░реАрдХреЗ рд╣реЛрддреЗ рд╣реИрдВ, рдЬреЛ рдпрд╣ рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдЧрд╛рдерд╛ рдХреЗ рдХрд╛рдо рдХреЗ рджреМрд░рд╛рди рдХреНрдпрд╛ рд╕рдВрдЧрдд рдкреНрд░рднрд╛рд╡ рдереЗред

рдпрд╣ рд╕рдм run() рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рд╡рд┐рдзрд┐ рд╕реАрдзреЗ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рддреА рд╣реИред

рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд╛рдн:

  • рдпрд╣ рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдХреЙрд▓ рдХрд╛ рдЕрдиреБрдХреНрд░рдо рдирд╣реАрдВ;
  • рдореЛрдХреА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рдлрд╝рдВрдХреНрд╢рди рдЧреАрд▓рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХреМрди рд╕реЗ рд░рд┐рдЯрд░реНрдиред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡рд╣рд╛рдБ рдХрд╛рдо рдХрд░рдирд╛ рд╣реИ:

  • рдЕрдзрд┐рдХ рдХреЛрдб рд╣реИ;
  • рдкрд░реАрдХреНрд╖рд╛ рдХреЛ рдкрдврд╝рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ;
  • рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ рдЕрднреА рднреА рдЧрд╛рдерд╛ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред

рдЕрдВрддрд┐рдо рджреЛ рд╕реНрдЯреНрд░реЛрдХ


рд╣рд╛рд▓рдд рдкрд░реАрдХреНрд╖рдг


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЛ рдареАрдХ рдХрд░рддреЗ рд╣реИрдВ: рд╣рдо рдПрдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░реАрдХреНрд╖рдг рд╕реЗ рдПрдХ рд░рд╛рдЬреНрдп рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ test-plan рд╣рдореЗрдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ state рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдФрд░ reducer рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рдЬреЛ рдХрд┐ рдЧрд╛рдерд╛ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЛ рдЬрд╡рд╛рдм рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд╕реЗ рд╣рдореЗрдВ рдорджрдж рдорд┐рд▓реЗрдЧреАред рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

 it('should increment click counter (state test with test-plan)', () => { const initialState = { clickCount: 11, return expectSaga(processClick) .provide([ call(ServerApi.SendClick), 14] ]) .withReducer(rootReducer, initialState) .dispatch(Actions.click()) .run() .then(result => expect(result.storeState.clickCount).toBe(14)) }) 

рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ, рд╣рдо рдЕрдм рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдИ рдкреНрд░рднрд╛рд╡ рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╣рдо рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдмрд╛рдж рдЕрдВрддрд┐рдо рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдареАрдХ рд╣реИред

рд╣рдо рдЧрд╛рдерд╛ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗ, рдЕрдм рдкрд░реАрдХреНрд╖рдг рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдЖрд╕рд╛рди рд╣реИ рдЕрдЧрд░ рдЖрдк then() async/await рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

 it('should increment click counter (state test with test-plan async-way)', async () => { const initialState = { clickCount: 11, } const saga = expectSaga(processClick) .provide([ call(ServerApi.SendClick), 14] ]) .withReducer(rootReducer, initialState) const result = await saga.dispatch(Actions.click()).run() expect(result.storeState.clickCount).toBe(14) }) 

рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдг


рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╣рдореЗрдВ рдПрдХ рд░рд┐рд╡рд░реНрд╕ рдХреНрд▓рд┐рдХ рдСрдкрд░реЗрд╢рди рдорд┐рд▓рд╛ рд╣реИ (рдЪрд▓реЛ рдЗрд╕реЗ рдЕрд╢реБрджреНрдз рдХрд╣рддреЗ рд╣реИрдВ), рдФрд░ рдЕрдм рд╣рдорд╛рд░реА sag рдлрд╛рдЗрд▓ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ:

 export function* processClick() { const result = yield call(ServerApi.SendClick) yield put(Actions.clickSuccess(result)) } export function* processUnclick() { const result = yield call(ServerApi.SendUnclick) yield put(Actions.clickSuccess(result)) } function* watchClick() { yield takeEvery(ActionTypes.CLICK, processClick) } function* watchUnclick() { yield takeEvery(ActionTypes.UNCLICK, processUnclick) } export default function* mainSaga() { yield all([watchClick(), watchUnclick()]) } 

рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдореЗрдВ рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рдХреНрд▓рд┐рдХ рдФрд░ рдЕрд╢реБрджреНрдз рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рд░рд╛рдЬреНрдп рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рд░реНрд╡рд░ рдХреА рдЕрдВрддрд┐рдо рдпрд╛рддреНрд░рд╛ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд░рд╛рдЬреНрдп рдХреЛ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рдРрд╕рд╛ рдкрд░реАрдХреНрд╖рдг redux-saga-test-plan рд╕рд╛рде рднреА рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 it('should change click counter (integration test)', async () => { const initialState = { clickCount: 11, } const saga = expectSaga(mainSaga) .provide([ call(ServerApi.SendClick), 14], call(ServerApi.SendUnclick), 18] ]) .withReducer(rootReducer, initialState) const result = await saga .dispatch(Actions.click()) .dispatch(Actions.unclick()) .run() expect(result.storeState.clickCount).toBe(18) }) 

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЕрдм рд╣рдо mainSaga рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рди рдХрд┐ рд╡реНрдпрдХреНрддрд┐рдЧрдд mainSaga рд╣реИрдВрдбрд▓рд░ рдХрд╛ред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрджрд┐ рд╣рдо рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ Vorning рдорд┐рд▓ рдЬрд╛рдПрдЧрд╛:



рдпрд╣ takeEvery рдкреНрд░рднрд╛рд╡ рдХреЗ рдХрд╛рд░рдг рд╣реИ - рдпрд╣ рдПрдХ рд╕рдВрджреЗрд╢ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд▓реВрдк рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЗ рдЦреБрд▓реЗ рд░рд╣рдиреЗ рдкрд░ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рддрджрдиреБрд╕рд╛рд░, рдЬрд┐рд╕ рдкрд░реАрдХреНрд╖рд╛ рдореЗрдВ takeEvery рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, takeEvery рдмрд╛рд╣рд░ рдХреА рдорджрдж рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ takeEvery , рдФрд░ redux-saga-test-plan рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рдмрд╛рдж 250 рдПрдордПрд╕ рдХреЗ рдмрд╛рдж рдЗрди рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЛ рдЬрдмрд░рди рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрддреА рд╣реИред рдЗрд╕ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреЛ рдЕрдкреЗрдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдХреЙрд▓ рдХрд░рдХреЗ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдпрджрд┐ рдЖрдк рдРрд╕реА рд╡реЛрд░рд┐рдВрдЧ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЬрдЯрд┐рд▓ рдкреНрд░рднрд╛рд╡ рдХреЗ рд╕рд╛рде, рдмрд╕ run() рд╡рд┐рдзрд┐ рдХреЗ рдмрдЬрд╛рдп рд╕рд╛рдЗрд▓реЗрдВрдЯ рд░реВрди run() рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред



рдиреБрдХрд╕рд╛рди


рдЬрд╣рд╛рдВ рдиреБрдХрд╕рд╛рди рдХреЗ рдмрд┐рдирд╛ ... рдЗрд╕ рд▓реЗрдЦрди рдХреЗ рд╕рдордп, рд░реЗрдбрдХреНрд╕-рд╕рд╛рдЧрд╛ рдХрд╛ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг: 1.0.2ред рдЗрд╕реА рд╕рдордп, redux-saga-test-plan рдХреЗрд╡рд▓ рдЬреЗрдПрд╕ рдкрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИред

рдпрджрд┐ рдЖрдк рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдмреАрдЯрд╛ рдЪреИрдирд▓ рд╕реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
npm install redux-saga-test-plan@beta
рдФрд░ рдирд┐рд░реНрдорд╛рдг рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдмрдВрдж рдХрд░ рджреЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, tsconfig.json рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рдЖрдкрдХреЛ "рдмрд╣рд┐рд╖реНрдХреГрдд" рдлрд╝реАрд▓реНрдб рдореЗрдВ рдкрде рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ "./src/**/*.spec.ts"ред

рдЗрд╕рдХреЗ рдмрд╛рд╡рдЬреВрдж, рд╣рдо redux-saga-test-plan рд▓рд┐рдП рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ redux-saga рд╣реИ, рддреЛ рд╢рд╛рдпрдж рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реЛрдЧрд╛ред

GitHub рдкрд░ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдбред

Source: https://habr.com/ru/post/hi458500/


All Articles