Pengembangan tim untuk meminta data dari database - bagian 4, menyimpulkan

Ini adalah kelanjutan dari kisah yang dimulai di sini , dan berlanjut di sini dan di sini .


Pada bagian terakhir, saya menulis tes integrasi yang menunjukkan proses inisialisasi dan mengeksekusi set handler lengkap yang mengekstrak data dari database. Tetapi karena mungkin butuh waktu terlalu lama dari menulis tes ini untuk menjalankannya, perlu untuk menyandikan tidak hanya handler, tetapi juga aturan konfigurasi untuk semua pertanyaan yang diperlukan ke database, hari ini saya memutuskan untuk mengimplementasikan versi modularnya, dirancang untuk mengkonfigurasi dan menjalankan semuanya satu penangan. Tes ini terlihat seperti ini:


describe('requestHandler', () => { const createStore = require('redux').createStore; const reducers = require('../../src/reducers.js'); const DbMock = require('../mocks/DbMock'); const db = new DbMock(); const rules = require('../../src/rules'); const dbRequest = require('../../src/storage/dbRequest'); let request = null, store = null, context = null; beforeEach(() => { store = createStore(reducers); context = { db, store, rules }; request = dbRequest.bind(context, [ 'user' ]); expect(store.getState().user).toBeNull(); expect(store.getState().error).toEqual([]); }); it('should get user from database', (done) => { const assert = checkUser.bind(context, [ done ]); store.subscribe(assert); store.dispatch({type: 'NOTE', note: { Id: 1, UserRecordId: 1 }}); request(); }); function checkUser(args) { const state = store.getState(); if(state.user === null) return; const user = state.user; expect(user.Id).toEqual(1); expect(user.Name).toEqual('Jack'); const checkIsCompleted = args[0]; checkIsCompleted(); } }); 

Saya menjalankan tes dan mendapatkan pesan bahwa modul dengan aturan tidak ditemukan. Sekali lagi, apa yang perlu diambil pawang dari aturan?


  1. Nama kunci properti kontainer properti di mana catatan yang diterima dari basis data akan diikat
  2. Nama tabel database tempat Anda ingin mengekstrak catatan
  3. Metode yang membentuk permintaan yang perlu dikirim ke database untuk mendapatkan respons
  4. Metode dispatcher yang mengirimkan catatan yang diterima dari database ke toko kontainer negara.
  5. Metode pengiriman yang mengirim kesalahan, jika ada, ke penyimpanan kontainer negara. Saya memutuskan untuk pertama mengkonsolidasikan kesalahan dalam wadah negara, dan kemudian menghadapinya.

Seperangkat aturan bagi saya adalah kamus ( Map ), di mana kuncinya adalah nama properti dari wadah negara dan saya mungkin akan merumuskan tes unit pertama:


 describe('rules', () => { const rules = require('../src/rules'); it('should contain user rules', () => { const rule = rules.get('user'); expect(rule.table).toEqual('users'); }); }); 

Saya menjalankan tes dan Jasmine mengatakan kepada saya bahwa sekarang saya memiliki dua tes gagal. Agar tidak menyulitkan tugas, saya akan mulai dengan aturan sederhana yang memberi tahu saya bahwa untuk menetapkan nilai ke kunci user wadah status, kueri saya harus pergi ke tabel users untuk data. Segalanya tampak logis. Saya akan menulis karena menurut saya sedikit kode.


 const makeRules = () => { const rules = new Map(); rules.set('user', { table: 'users' }); return rules; }; module.exports = makeRules(); 

Saya menjalankan tes, dan saya melihat bahwa hanya tes untuk handler saya crash, walaupun kesalahannya sekarang berbeda. Namun, saya akan kembali ke tes ini nanti, ketika saya akan memiliki setidaknya satu aturan lengkap dalam kamus saya.


Saya akan sedikit memodifikasi kamus aturan. Saya akan menambahkan kode yang memeriksa keberadaan metode dispatcher yang menangani kesalahan dalam mengeksekusi query database:


 describe('rules', () => { const rules = require('../src/rules'); it('should contain user rules', () => { const rule = rules.get('user'); expect(rule.table).toEqual('users'); expect(rule.onError.name).toEqual('dispatchError'); expect(typeof rule.onError).toEqual('function'); }); }); 

Saya menjalankan tes, pastikan bahwa saya lagi memiliki dua tes gagal, dan kembali menyelesaikan kode metode pabrik untuk menghasilkan kamus aturan. Saya menambahkan fungsi ke objek literal dari aturan pertama:


 const makeRules = () => { const rules = new Map(); rules.set('user', { table: 'users', onError: function dispatchError(error, store) { const action = { type: 'ERROR', error }; store.dispatch(action); } }); return rules; }; module.exports = makeRules(); 

Menjalankan tes lagi. Fragmen aturan baru berhasil lulus tes, jadi saya memutuskan untuk menambahkan pemeriksaan untuk semua aturan yang tersisa:


 describe('rules', () => { const rules = require('../src/rules'); it('should contain user rules', () => { const rule = rules.get('user'); expect(rule.table).toEqual('users'); expect(rule.onError.name).toEqual('dispatchError'); expect(typeof rule.onError).toEqual('function'); expect(rule.onSuccess.name).toEqual('dispatchUser'); expect(typeof rule.onSuccess).toEqual('function'); expect(rule.query.name).toEqual('getUserQuery'); expect(typeof rule.query).toEqual('function'); }); }); 

Saya menjalankan tes. Kumpulan tes untuk kamus aturan sekali lagi melempar kesalahan. Saya menulis kode:


 const makeRules = () => { const rules = new Map(); rules.set('user', { table: 'users', onError: function dispatchError(error, store) { const action = { type: 'ERROR', error }; store.dispatch(action); }, onSuccess: function dispatchUser(user, store) { const action = { type: 'USER', user }; store.dispatch(action); }, query: function getUserQuery(store) { const state = store.getState(); if(state.note === null) return null; return { Id: state.note.UserRecordId }; } }); return rules; }; module.exports = makeRules(); 

Saya menjalankan tes. Tes dari ruleset kembali berhasil dilakukan, dan menurut saya sekarang saya dapat mulai menulis kode untuk versi yang sebenarnya baru dari meminta data dari database. Kali ini saya tidak akan menggunakan sintaks kelas, karena saya tidak melihat kelebihan dari penggunaannya. Akan ada banyak kode sekaligus, karena saya dengan kejam menyalin bagian yang diuji dari implementasi permintaan yang ada, melengkapi dengan cek, jika catatan dari database telah diekstraksi dan ditempatkan di wadah status. Jadi kodenya:


 function dbRequest(args){ const key = args[0]; const getQuery = this.rules.get(key).query; const dispatchUser = this.rules.get(key).onSuccess; const dispatchError = this.rules.get(key).onError; const tableName = this.rules.get(key).table; const table = this.db.Model.extend({ tableName: tableName }); const state = this.store.getState(); if(state[key] !== null) return; const query = getQuery(this.store); if(query === null) return; table.where(query).fetch().then((item) => { dispatchUser(item, this.store); }).catch((error) => { dispatchError(error, this.store); }); } module.exports = dbRequest; 

Tes lari ... drum roll! Dan saya melihat garis titik-titik hijau. Semua tes berhasil diselesaikan. Jadi saya akan menambahkan tes lain ke set yang memeriksa kebenaran penanganan kesalahan, sampai saya lupa bahwa agar DbMock pseudo saya DbMock mengembalikan kesalahan, saya perlu memintanya untuk entri dengan Id sama dengan 555 :


 it('should add error in store state', (done) => { const assert = checkErrorHasBeenAdded.bind(context, [ done ]); store.subscribe(assert); store.dispatch({type: 'NOTE', note: { Id: 1, UserRecordId: 555 }}); request(); }); function checkErrorHasBeenAdded(args){ const state = store.getState(); if(state.error.length === 0) return; const error = state.error; expect(Array.isArray(error)).toBeTruthy(); expect(error.length).toEqual(1); expect(error[0].message).toEqual('Something goes wrong!'); const checkIsCompleted = args[0]; checkIsCompleted(); } 

Saya menjalankan tes lagi. Semuanya berfungsi seperti yang diharapkan. Kita dapat mengasumsikan bahwa prototipe yang benar dari perintah kueri ke database siap dan kembali ke refactoring dan mengembangkan aturan untuk mengonfigurasi kueri, karena sekarang jelas bahwa kode untuk menghasilkan set aturan akan berhenti dibaca setelah menambahkan hanya beberapa aturan dalam format yang sama.

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


All Articles