рдкрд┐рдЫрд▓реЗ рднрд╛рдЧ рдореЗрдВ, рдореИрдВрдиреЗ рдЗрд╕ рддрдереНрдп рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд┐рдпрд╛ рдХрд┐ рдореИрдВ рдЬрд┐рд╕ рдЯреАрдо рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд╡рд╣ рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
it('execute should return promise', () => { request.configure(options); request.execute().then((result) => { expect(result.Id).toEqual(1); expect(result.Name).toEqual('Jack'); }); });
рдЕрдм рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ Promise
рдФрд░ рдЗрд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рдХрд╛рдлреА рдирд╣реАрдВ рд╣реИ рдЬреЛ рдореИрдВ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ рдХрд┐ рдЯреАрдо рдЦреБрдж рдЗрд╕ рд░реВрдЯреАрди рдХрд╛рдо рдХреЛ рдЕрдВрдЬрд╛рдо рджреЗ, рдФрд░ рдирддреАрдЬрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Redux
рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред рдореИрдВ рдЗрд╕рдореЗрдВ рдЕрдкрдиреА рдирдИ рдЕрдкреЗрдХреНрд╖рд╛рдУрдВ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореМрдЬреВрджрд╛ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛:
const store = require('../../src/store'); const DbMock = require('../mocks/DbMock'); const db = new DbMock(); const Request = require('../../src/storage/Request'); const options = { tableName: 'users', query: { Id: 1 } }; let request = null; beforeEach(() => { request = new Request(db, store); }); it('should dispatch action if record exists', () => { request.configure(options); request.execute(() => { const user = store.getState().user; expect(user.Id).toEqual(options.query.Id); expect(user.Name).toEqual('Jack'); }); });
рдпрд╣ рд╢рд╛рдпрдж рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдореБрдЭреЗ рдЕрдм рдХреЙрд▓рдмреИрдХ рдкрджреНрдзрддрд┐ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Request
рд╡рд░реНрдЧ рдХрд╛ execute
рд╡рд┐рдзрд┐ рд╕рд┐рдЦрд╛рдирд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрд╕реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЖрдк рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдХреНрдпреЛрдВрдХрд┐ execute
рдЕрдВрджрд░ рдореИрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рди рд▓реЗрддрд╛ рд╣реВрдВ, рдЬрд┐рд╕рдХреЗ рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдХреЗрд╡рд▓ рддрднреА рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдЙрдиреНрд╣реЗрдВ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЙрдирдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИред
рдЖрдЧреЗ ... рдХреЛрдб рдХреА рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдореИрдВ Request
рд╡рд░реНрдЧ рдХреЗ рдХреЛрдб рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдкрд╕ рдЖрдКрдВ, рдореБрдЭреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ Redux
рдкреИрдХреЗрдЬ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ,
рдХрдо рд╕реЗ рдХрдо рдПрдХ
рд▓рд╛рдЧреВ рдХрд░реЗрдВ
рдФрд░ рдЕрд▓рдЧ рд╕реЗ рдЗрд╕ reducer рдХреЛ Store
рдореЗрдВ рдкреИрдХреЗрдЬ рдХрд░реЗрдВред рдкрд╣рд▓рд╛ рдЯреЗрд╕реНрдЯ рд╢рд╛рдпрдж рдЧрд┐рдпрд░рдмреЙрдХреНрд╕ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛:
const reduce = require('../../src/reducers/user'); it('should return new state', () => { const user = { Id: 1, Name: 'Jack'}; const state = reduce(null, {type: 'USER', user }); expect(state).toEqual(user); });
рдореИрдВ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рддрд╛ рд╣реВрдВ рдФрд░ Jasmine
рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдкрд┐рдЫрд▓реА рд╕рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдореЙрдбреНрдпреВрд▓ ../../src/reducers/user
рдирд╣реАрдВ рдорд┐рд▓рд╛ ../../src/reducers/user
ред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдЗрд╕реЗ рд▓рд┐рдЦреВрдВрдЧрд╛, рдЦрд╛рд╕рдХрд░ рдЬрдм рд╕реЗ рдпрд╣ рдЫреЛрдЯреЗ рдФрд░ рдмрд╣реБрдд рдЕрдиреБрдорд╛рдирд┐рдд рд╣реЛрдиреЗ рдХрд╛ рд╡рд╛рджрд╛ рдХрд░рддрд╛ рд╣реИ:
const user = (state = null, action) => { switch (action.type) { case 'USER': return action.user; default: return state; } }; module.exports = user;
рдореИрдВ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рддрд╛ рд╣реВрдВ рдФрд░ рдХрдЯреНрдЯрд░рдкрдВрдереА рд╕реБрдзрд╛рд░ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рд╣реВрдВред рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдореЙрдбреНрдпреВрд▓ ../../src/store
, рдЬрд┐рд╕рдХрд╛ рдЕрд╕реНрддрд┐рддреНрд╡ рдореИрдВрдиреЗ рдЕрдкрдиреЗ Request
рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдЧреНрд░рд╣рдг рдХрд┐рдпрд╛ рдерд╛, рдореИрдВрдиреЗ рдЕрднреА рддрдХ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдФрд░ рдЙрд╕рдХрд╛ рдХреЛрдИ рдкрд░реАрдХреНрд╖рдг рдЕрднреА рддрдХ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИред рдореИрдВ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реВрдБрдЧрд╛:
describe('store', () => { const store = require('../src/store'); it('should reduce USER', () => { const user = { Id: 1, Name: 'Jack' }; store.dispatch({type: 'USER', user }); const state = store.getState(); expect(state.user).toEqual(user); }); });
рдЯреЗрд╕реНрдЯ? store
рдореЙрдбреНрдпреВрд▓ рдХреА рдХрдореА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд░рд┐рдкреЛрд░реНрдЯ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рддреБрд░рдВрдд рд╕реМрджрд╛ рдХрд░реВрдВрдЧрд╛ред
const createStore = require('redux').createStore; const combineReducers = require('redux').combineReducers; const user = require('./reducers/user'); const reducers = combineReducers({user}); const store = createStore(reducers); module.exports = store;
рдпрд╣ рд╕рдордЭрддреЗ рд╣реБрдП рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдЧрд┐рдпрд░рдмреЙрдХреНрд╕ рд╣реЛрдВрдЧреЗ, рдореИрдВ
рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдереЛрдбрд╝рд╛ рдЖрдЧреЗ рдмрдврд╝рддрд╛ рд╣реВрдВ рдФрд░ рд╕рдВрдпреЛрдЬрди combineReducers
рд╕рдордп combineReducers
рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ combineReducers
ред рдореИрдВ рдлрд┐рд░ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рддрд╛ рд╣реВрдВ рдФрд░ рдПрдХ рдирдпрд╛ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рджреЗрдЦрддрд╛ рд╣реВрдВ рдЬреЛ рдореБрдЭреЗ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ Request
рд╡рд░реНрдЧ рдХреА execute
рд╡рд┐рдзрд┐ рдореЗрд░реЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреА рд╣реИред рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╡рд┐рдзрд┐ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд░рд┐рдХреЙрд░реНрдб
рдореЗрдВ рдкреНрд░рдХрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛
ред Request
рдХреНрд▓рд╛рд╕ рдХреЛ рд░рд┐рдлрд▓реЗрдХреНрдЯрд░ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред
рдореБрдЭреЗ рдпрд╛рдж рд╣реИ рдХрд┐ рдЕрдм execute
рд╡рд┐рдзрд┐ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
it('should dispatch action if record exists', () => { request.configure(options); request.execute(() => { const user = store.getState().user; expect(user.Id).toEqual(options.query.Id); expect(user.Name).toEqual('Jack'); }); });
рдФрд░ рдореИрдВ рд╕реНрд╡рдпрдВ рд╡рд┐рдзрд┐ рдХрд╛ рдХреЛрдб рддрдп рдХрд░реВрдВрдЧрд╛ рддрд╛рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдореМрдХрд╛ рдорд┐рд▓реЗ:
execute(callback){ const table = this.db.Model.extend({ tableName: this.options.tableName }); table.where(this.options.query).fetch().then((item) => { this.store.dispatch({ type: 'USER', user: item }); if(typeof callback === 'function') callback(); }); }
рдореИрдВ npm test
рдХрдВрд╕реЛрд▓ рдФрд░ ... рдмрд┐рдВрдЧреЛ рдореЗрдВ рдЯрд╛рдЗрдк рдХрд░реВрдБрдЧрд╛! рдореЗрд░рд╛ рдЕрдиреБрд░реЛрдз рди рдХреЗрд╡рд▓ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдЦрд╛, рдмрд▓реНрдХрд┐ рднрд╡рд┐рд╖реНрдп рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ
рдореЗрдВ рдЗрд╕реЗ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рд╣реИ, рддрд╛рдХрд┐ рдмрд╛рдж рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдмрд┐рдирд╛ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░рд╛рдкреНрдд рд╣реЛ рд╕рдХреЗред
рд▓реЗрдХрд┐рди! рдореЗрд░рд╛ рд╣реИрдВрдбрд▓рд░ рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЛ
рдореЗрдВ рднреЗрдЬ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдЗрд╕рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕ рдХреЛрдб рдХрд╛ рдмрд╛рд░-рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬрдм рднреА рдореБрдЭреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдХреБрдЫ рд░рд┐рдХреЙрд░реНрдб рдирд┐рдХрд╛рд▓рдиреЗ рдФрд░ рдХреБрдВрдЬреА рдХреЗ рддрд╣рдд рдЖрдЧреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП
рд╕реЗрд▓ рдХреЛ рднреЗрдЬрдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред рдФрд░ рдЗрд╕рд▓рд┐рдП рдореИрдВ рдкрд░реАрдХреНрд╖рдг рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ:
const options = { tableName: 'users', query: { Id : 1 }, success (result, store) { const type = 'USER'; const action = { type , user: result }; store.dispatch(action); } }; it('should dispatch action if record exists', () => { request.configure(options); request.execute(() => { const user = store.getState().user; expect(user.Id).toEqual(options.query.Id); expect(user.Name).toEqual('Jack'); }); });
рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╣реБрдЖ рд╣реИ рдХрд┐ рдХреНрд╡реЗрд░реА рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Request
рд╡рд░реНрдЧ рдХреЛ рдЕрд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕реЗ рдмрдЪрд╛рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рд╢рдмреНрджрд╛рд░реНрде Request
рдПрдХ рдирд┐рд╡реЗрджрди рд╣реИред рдЕрдиреБрд░реЛрдз рдкреВрд░рд╛ рдХрд░рдиреЗ рдкрд░, рдЬрд╡рд╛рдм рдорд┐рд▓рд╛, рдХрд╛рд░реНрдп рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рд╡рд░реНрдЧ рдХреА рдПрдХрдорд╛рддреНрд░ рдЬрд┐рдореНрдореЗрджрд╛рд░реА рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рд╕рдореНрдорд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХрд┐рд╕реА рдХреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рджреЗрдВ, рдЬрд┐рд╕рдХреА рдПрдХрдорд╛рддреНрд░ рдЬрд┐рдореНрдореЗрджрд╛рд░реА рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрд╕реНрдХрд░рдг рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ success
рд╡рд┐рдзрд┐ рдХреЛ рдЕрдиреБрд░реЛрдз рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛, рдЬреЛ рдЕрдиреБрд░реЛрдз рджреНрд╡рд╛рд░рд╛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд▓реМрдЯрд╛рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рд╣реИред
рдЯреЗрд╕реНрдЯ, рдЕрдм рдЖрдк рдирд╣реАрдВ рдЪрд▓рд╛ рд╕рдХрддреЗред рдореИрдВ рдЙрд╕ рдмреМрджреНрдзрд┐рдХ рд░реВрдк рд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВред рдореИрдВрдиреЗ рд╕реНрд╡рдпрдВ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдХреБрдЫ рднреА рдареАрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓рд╛, рдФрд░ рдкрд░реАрдХреНрд╖рдг рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЪрд▓рддреЗ рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рднрд╛рд╡рдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ, рдореБрдЭреЗ npm test
рдХрдорд╛рдВрдб рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдореИрдВ рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рдореИрдВ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрди рдХреЗ рд╕рд╛рде store.dispatch(...)
рд╕рд╛рде рд▓рд╛рдЗрди рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП Request
рд╡рд░реНрдЧ рдореЗрдВ рдЕрдкрдиреЗ execute
рд╡рд┐рдзрд┐ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддрд╛ рд╣реВрдВ this.options.success(...)
:
execute(callback){ const table = this.db.Model.extend({ tableName: this.options.tableName }); table.where(this.options.query).fetch().then((item) => { this.options.success(item, this.store); if(typeof callback !== 'undefined') callback(); }); }
рдореИрдВ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рддрд╛ рд╣реВрдВред рджреЗрдЦрд╛! рдЯреЗрд╕реНрдЯ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рд░реЗ рд╣реИрдВред рдЬреАрд╡рди рдмреЗрд╣рддрд░ рд╣реЛ рд░рд╣рд╛ рд╣реИ! рдЖрдЧреЗ рдХреНрдпрд╛ рд╣реИ? рддреБрд░рдВрдд рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдкрдХреЛ рдкрд░реАрдХреНрд╖рдг рдХрд╛ рд╢реАрд░реНрд╖рдХ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдХреЗ рдЕрдиреБрд░реВрдк рдирд╣реАрдВ рд╣реИред рдкрд░реАрдХреНрд╖рдг рдпрд╣ рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЕрдиреБрд░реЛрдз рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╡рд┐рдзрд┐ рдХрд╛ рдкреНрд░реЗрд╖рдг рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрд╡реЗрд░реА рдХрдВрдЯреЗрдирд░ рдореЗрдВ рд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдкрд░реАрдХреНрд╖рд╛ рдХрд╛ рд╢реАрд░реНрд╖рдХ рдмрджрд▓ рджреЗрддрд╛ рд╣реВрдВ ... рдареАрдХ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
it('should update store user state if record exists', () => { request.configure(options); request.execute(() => { const user = store.getState().user; expect(user.Id).toEqual(options.query.Id); expect(user.Name).toEqual('Jack'); }); });
рдЖрдЧреЗ рдХреНрдпрд╛ рд╣реИ? рдФрд░ рдлрд┐рд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдиреБрд░реЛрдз рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЗ рдмрдЬрд╛рдп, рдореЗрд░реЗ рдЕрдиреБрд░реЛрдз рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХрд╛ рд╕рдордп рд╣реИ, рдореЗрд░рд╛ рдЕрдиреБрд░реЛрдз рдПрдХ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рдПрдЧрд╛ред рдпрд╣ рдЗрддрдирд╛ рдЕрд╕рдВрднрд╡ рдкрд░рд┐рджреГрд╢реНрдп рдирд╣реАрдВ рд╣реИред рд╕рдЪ? рдФрд░ рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ рдЕрдкрдиреЗ рдХреЗрд╡рд╛рдИрд╕реА рдСрдкрд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рд╕реЗрдЯ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдФрд░ рднреЗрдЬрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдПрдХреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдореИрдВ рдпрд╣ рд╕рдм рдХреЛрдб рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВред рдХреНрдпрд╛ рдРрд╕рд╛ рд╣реИ? So. рдкрд╣рд▓реЗ рдореИрдВ рдПрдХ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦреВрдВрдЧрд╛:
it('should add item to store error state', () => { options.query = { Id: 555 }; options.error = (error, store) => { const type = 'ERROR'; const action = { type, error }; store.dispatch(action); }; request.configure(options); request.execute(() => { const error = store.getState().error; expect(Array.isArray(error)).toBeTruthy(); expect(error.length).toEqual(1); expect(error[0].message).toEqual('Something goes wrong!'); }); });
рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдХреНрдпрд╛ рдкрд░реАрдХреНрд╖рдг рдХреА рд╕рдВрд░рдЪрдирд╛ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рд╕рдордп рдФрд░ рдкреИрд╕рд╛ рдмрдЪрд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЕрдиреБрд░реЛрдз рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ? рджреЗрдЦрд╛ рдирд╛?
рдореИрдВ TableMock
рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ TableMock
рдХрд░рдиреЗ рдореЗрдВ рд╕рдордп рдмрд░реНрдмрд╛рдж рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛, рдЬреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░реЗрдЧрд╛ред рдореИрдВрдиреЗ рддрдп рдХрд┐рдпрд╛ рдХрд┐ рдЗрд╕ рд╕рдордп рдореМрдЬреВрджрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдПрдХ рдЬреЛрдбрд╝реА рд╕рд╢рд░реНрдд рдирд┐рд░реНрдорд╛рдг рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдлреА рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛, рдФрд░ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдХрд┐ рдЗрд╕реЗ рдХреНрд╡реЗрд░реА query
рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рддреЛ рдореЗрд░реА рдзрд╛рд░рдгрд╛рдПрдВ рд╣реИрдВ:
- рдпрджрд┐
options.query
рдореЗрдВ Id
options.query
рдХреНрд╡реЗрд░реА рдХреНрд╡реЗрд░реА 1 рд╣реИ , рддреЛ рдореЗрд░реА рдЫрджреНрдо-рддрд╛рд▓рд┐рдХрд╛ рд╣рдореЗрд╢рд╛ рд╕рдВрдЧреНрд░рд╣ рд╕реЗ рдмрд╣реБрдд рдкрд╣рд▓реЗ рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд╕рд╛рде рдЕрдиреБрдордд Promise
рд╡рд╛рдкрд╕ рдХрд░рддреА рд╣реИред - рдпрджрд┐
options.query
рдореЗрдВ Id
555 рд╣реИ , рддреЛ рдореЗрд░реА рдЫрджреНрдо-рддрд╛рд▓рд┐рдХрд╛ рд╣рдореЗрд╢рд╛ рдПрдХ Error
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рдЕрд╕реНрд╡реАрдХреГрдд Promise
рд▓реМрдЯрд╛рддреА рд╣реИ, рдЬрд┐рд╕рдХрд╛ message
рд╕рд╛рдордЧреНрд░реА рдХреБрдЫ рдЧрд▓рдд рд╣реИ! ред
рдмреЗрд╢рдХ, рдпрд╣ рдЖрджрд░реНрд╢ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИред рдпрд╣ рдЗрд╕реА DbMock
рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрд╛рд░рдгрд╛ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкрдардиреАрдп рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, HealthyDbMock
, FaultyDbMock
, EmptyDbMock
ред рдЬрд┐рди рдирд╛рдореЛрдВ рд╕реЗ рдпрд╣ рддреБрд░рдВрдд рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдкрд╣рд▓рд╛ рд╣рдореЗрд╢рд╛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рджреВрд╕рд░рд╛ рд╣рдореЗрд╢рд╛ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдФрд░ рддреАрд╕рд░реЗ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдпрд╣ рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдмрдЬрд╛рдп рд╣рдореЗрд╢рд╛ null
рд░рд╣реЗрдЧрд╛ред рд╢рд╛рдпрдж, рдЙрдкрд░реЛрдХреНрдд рддрд░реАрдХреЛрдВ рд╕реЗ рдореЗрд░реА рдкрд╣рд▓реА рдорд╛рдиреНрдпрддрд╛рдУрдВ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдХрдо рд╕реЗ рдХрдо рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ, рдореИрдВ рджреЛ рдЕрддрд┐рд░рд┐рдХреНрдд DbMock
рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд▓рд╛рдЧреВ DbMock
рдЬреЛ рдЕрд╕реНрд╡рд╛рд╕реНрдереНрдпрдХрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдирдХрд▓ рдХрд░рддреЗ рд╣реИрдВред
рдореИрдВ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рддрд╛ рд╣реВрдВред рдореБрдЭреЗ
рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╕рдВрдкрддреНрддрд┐ рдХреА рдХрдореА рдХреА рдЕрдкреЗрдХреНрд╖рд┐рдд рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ рдФрд░ ... рдореИрдВ рдПрдХ рдФрд░ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВред рдЗрд╕ рдмрд╛рд░ рдЧрд┐рдпрд░рдмреЙрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЯрд╛рдЗрдк ERROR
рд╕рд╛рде рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рд╣реИрдВрдбрд▓ рдХрд░реЗрдЧрд╛ред
describe('error', () => { const reduce = require('../../src/reducers/error'); it('should add error to state array', () => { const type = 'ERROR'; const error = new Error('Oooops!'); const state = reduce(undefined, { type, error }); expect(Array.isArray(state)).toBeTruthy(); expect(state.length).toEqual(1); expect(state.includes(error)).toBeTruthy(); }); });
рдлрд┐рд░ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдЪрд▓ рд░рд╣рд╛ рд╣реИред рд╕рдм рдХреБрдЫ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИ, рдореМрдЬреВрджрд╛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ рдПрдХ рдФрд░ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред рдореБрдЭреЗ
рдПрд╣рд╕рд╛рд╕ рд╣реИ:
const error = (state = [], action) => { switch (action.type) { case 'ERROR': return state.concat([action.error]); default: return state; } }; module.exports = error;
рдореИрдВ рдлрд┐рд░ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛ рд░рд╣рд╛ рд╣реВрдБ рдирдпрд╛ reducer рдЕрдкреЗрдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЕрднреА рднреА рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рдЬреБрдбрд╝рддрд╛ рд╣реИ рдФрд░ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдпрд╣ рдЗрд░рд╛рджрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдореМрдЬреВрджрд╛ рднрдВрдбрд╛рд░рдг рдкрд░реАрдХреНрд╖рдг рд╕реВрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВ:
it('should reduce error', () => { const type = 'ERROR'; const error = new Error('Oooops!'); store.dispatch({ type, error }); const state = store.getState(); expect(Array.isArray(state.error)).toBeTruthy(); expect(state.error.length).toEqual(1); expect(state.error.includes(error)).toBeTruthy(); });
рдореИрдВ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рддрд╛ рд╣реВрдВред рд╕рдм рдХреБрдЫ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИред ERROR
рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдХреНрд░рд┐рдпрд╛ рдореМрдЬреВрджрд╛ рднрдВрдбрд╛рд░рдг рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рдХрд░рддреА рд╣реИред рдореМрдЬреВрджрд╛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛрдб рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛:
const createStore = require('redux').createStore; const combineReducers = require('redux').combineReducers; const user = require('./reducers/user'); const error = require('./reducers/error'); const reducers = combineReducers({ error, user }); const store = createStore(reducers); module.exports = store;
рд╕реМрд╡реАрдВ рдмрд╛рд░ рдЙрдиреНрд╣реЛрдВрдиреЗ рдПрдХ рдЬрд╛рд▓ рдлреЗрдВрдХрд╛ ... рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛! рднрдВрдбрд╛рд░ рдЕрдм рдПрдХ рдЕрд▓рдЧ рдХрдВрдЯреЗрдирд░ рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред
рдЕрдм рдореИрдВ рдореМрдЬреВрджрд╛ TableMock
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдХреБрдЫ рд╕рд╢рд░реНрдд рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреЛ рдкреЗрд╢ TableMock
, рдЬреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХреБрдЫ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП TableMock
, рдПрдХ рддреНрд░реБрдЯрд┐ TableMock
ред рдЕрджреНрдпрддрди рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
class TableMock { constructor(array){ this.container = array; } where(query){ this.query = query; return this; } fetch(){ return new Promise((resolve, reject) => { if(this.query.Id === 1) return resolve(this.container[0]); if(this.query.Id === 555) return reject(new Error('Something goes wrong!')); }); } } module.exports = TableMock;
рдореИрдВ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рддрд╛ рд╣реВрдВ рдФрд░ Request
рд╡рд░реНрдЧ рдХреЗ execute
рд╡рд┐рдзрд┐ рдореЗрдВ Promise
рдХреА рдЕрдЦрдВрдб рдЕрд╕реНрд╡реАрдХреГрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реВрдВред рдореИрдВ рд▓рд╛рдкрддрд╛ рдХреЛрдб рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ:
execute(callback){ const table = this.db.Model.extend({ tableName: this.options.tableName }); table.where(this.options.query).fetch().then((item) => { this.options.success(item, this.store); if(typeof callback === 'function') callback(); }).catch((error) => { this.options.error(error, this.store); if(typeof callback === 'function') callback(); }); }
рдФрд░ рдореИрдВ рдлрд┐рд░ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рддрд╛ рд╣реВрдВред рдФрд░ ??? Request
рдХрдХреНрд╖рд╛ рдХреЗ execute
рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдИ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдПрдХ:
it('should add item to store error state', () => { options.query = { Id: 555 }; options.error = (error, store) => { const type = 'ERROR'; const action = { type, error }; store.dispatch(action); }; request.configure(options); request.execute(() => { const error = store.getState().error; expect(Array.isArray(error)).toBeTruthy(); expect(error.length).toEqual(1); expect(error[0].message).toEqual('Something goes wrong!'); }); });
рд╡рд╣ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреВрд░рд╛ рд╣реБрдЖред рддреЛ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХреНрд╡реЗрд░реА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдЧрд┐рд░ рдЧрдпрд╛, рдПрдХ рдЬреЛ рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рднрдВрдбрд╛рд░ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдореЗрд░рд╛ рднрдВрдбрд╛рд░рдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЙрдбреНрдпреВрд▓ рд╕рднреА рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рд╕рднреА рдЙрдкрднреЛрдХреНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рд╕реНрдерд┐рд░ рднрдВрдбрд╛рд░рдг рдЙрджрд╛рд╣рд░рдг рджреЗрддрд╛ рд╣реИред рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ, рдЪреВрдВрдХрд┐ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдкреНрд░реЗрд╖рдг рджреЛ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реЛрддрд╛ рд╣реИ, рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рд╕рддреНрдпрд╛рдкрди рдЬрд░реВрд░реА рдирд╣реАрдВ рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рддрдХ рдкрд░реАрдХреНрд╖рдг рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрдм рддрдХ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ рдФрд░ рдкрд░реАрдХреНрд╖рдг рд▓реЙрдиреНрдЪ рдХреЗ рджреМрд░рд╛рди рдПрдХ рдФрд░ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рддреЛ рдпрд╣рд╛рдБ рдпрд╣ рдХреЛрдб рд╣реИ:
const error = store.getState().error; expect(error.length).toEqual(1);
рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрддрд╛ рд╣реИ, рдЬреЛ error.length
рд╣реИ рдХрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ error.length
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ 2 рд╣реИ, рди рдХрд┐ 1. рдЕрднреА рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдореИрдВ рдХреЗрд╡рд▓ рд╕реНрдЯреЛрд░реЗрдЬ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛрдб рдХреЛ рд╕реАрдзреЗ рд╕реНрдЯреЛрд░реЗрдЬ рдЯреЗрд╕реНрдЯ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛрдб рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдХреЗ рд╣рд▓ рдХрд░реВрдВрдЧрд╛:
describe('store', () => { const createStore = require('redux').createStore; const combineReducers = require('redux').combineReducers; const user = require('../src/reducers/user'); const error = require('../src/reducers/error'); const reducers = combineReducers({ error, user }); const store = createStore(reducers); it('should reduce USER', () => { const user = { Id: 1, Name: 'Jack' }; store.dispatch({type: 'USER', user }); const state = store.getState(); expect(state.user).toEqual(user); }); it('should reduce error', () => { const type = 'ERROR'; const error = new Error('Oooops!'); store.dispatch({ type, error }); const state = store.getState(); expect(Array.isArray(state.error)).toBeTruthy(); expect(state.error.length).toEqual(1); expect(state.error.includes(error)).toBeTruthy(); }); });
рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЖрд░рдВрднреАрдХрд░рдг рдХреЛрдб рдЕрдм рдереЛрдбрд╝рд╛ рд╕реВрдЬ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдмрд╛рдж рдореЗрдВ рдЗрд╕рдХреА рд░рд┐рдлрд▓реЗрдХреНрдЯрд┐рдВрдЧ рдореЗрдВ рд▓реМрдЯ рд╕рдХрддрд╛ рд╣реВрдВред
рдореИрдВ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рддрд╛ рд╣реВрдВред рджреЗрдЦрд╛! рд╕рднреА рдкрд░реАрдХреНрд╖рдг рдкреВрд░реЗ рд╣реЛ рдЪреБрдХреЗ рд╣реИрдВ рдФрд░ рдЖрдк рд╡рд┐рд░рд╛рдо рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред