تطوير فريق للاستعلام عن البيانات من قاعدة البيانات - الجزء 4 ، خاتمة

هذا هو استمرار للقصة التي بدأت هنا ، واستمرت هنا وهنا .


في الجزء الأخير ، كتبت اختبار تكامل يوضح عملية تهيئة وتنفيذ مجموعة كاملة من معالجات استخراج البيانات من قاعدة بيانات. ولكن نظرًا لأن الأمر قد يستغرق وقتًا طويلاً من كتابة هذا الاختبار إلى تشغيله ، فمن الضروري ترميز ليس فقط المعالج ، ولكن أيضًا قواعد التكوين لجميع الاستعلامات الضرورية إلى قاعدة البيانات ، لقد قررت اليوم تطبيق إصدارها المعياري ، المصمم لتكوين وتشغيل كل شيء معالج واحد. هذا الاختبار يشبه هذا:


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(); } }); 

أقوم بإجراء الاختبارات وأحصل على رسالة تفيد بأنه لم يتم العثور على الوحدة مع القواعد. مرة أخرى ، ما الذي سيحتاج المعالج إلى انتزاعه من القواعد؟


  1. اسم مفتاح خاصية حاوية الخاصية الذي سيتم ربط السجل الذي تم استلامه من قاعدة البيانات
  2. اسم جدول قاعدة البيانات الذي تريد استخراج السجل منه
  3. الطريقة التي تشكل الطلب الذي سيتم إرساله إلى قاعدة البيانات للحصول على استجابة
  4. أسلوب المرسل الذي يرسل السجل الذي تم استلامه من قاعدة البيانات إلى مخزن حاويات الحالة.
  5. طريقة إرسال ترسل خطأ ، إن وجدت ، إلى تخزين حاوية الحالة. قررت أولاً دمج الأخطاء في حاوية الحالة ، ثم التعامل معها.

يبدو لي أن مجموعة القواعد هي قاموس ( Map ) ، حيث سيكون المفتاح هو اسم خاصية حاوية الحالة ، وربما أقوم بصياغة اختبار الوحدة الأول:


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

أجري الاختبارات ، وأخبرني Jasmine أنني الآن لديّ اختباران فاشلان. من أجل عدم تعقيد المهمة ، سأبدأ بقاعدة بسيطة تخبرني أنه من أجل تعيين قيمة لمفتاح user في حاوية الحالة ، يجب أن ينتقل طلبي إلى جدول users للبيانات. يبدو أن كل شيء منطقي. سأكتب كما يبدو لي رمز قليلا.


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

أقوم بإجراء الاختبارات ، وأرى أنه فقط تعطل اختبار معالجي ، على الرغم من أن الخطأ مختلف الآن. ومع ذلك ، سأعود إلى هذا الاختبار لاحقًا ، عندما يكون لديّ قاعدة كاملة واحدة على الأقل في قاموسي جاهزة.


سأقوم بتعديل اختبار قاموس القواعد قليلاً. سأضيف رمزًا يتحقق من وجود طريقة إرسال تقوم بمعالجة خطأ في تنفيذ استعلام إلى قاعدة البيانات:


 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'); }); }); 

أقوم بإجراء الاختبارات ، وتأكد من امتلاكي مرة أخرى لاختباري فاشلين ، والعودة إلى إنهاء كود طريقة المصنع لإنشاء قاموس القاعدة. أقوم بإضافة الوظيفة إلى الكائن الحرفي للقاعدة الأولى:


 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(); 

تشغيل الاختبارات مرة أخرى. تجتاز جزء القاعدة الجديدة الاختبار بنجاح ، لذلك قررت إضافة اختبارات لجميع القواعد المتبقية:


 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'); }); }); 

أركض الاختبارات. اختبار مجموعة قاموس القاعدة مرة أخرى يلقي خطأ. أنا أكتب الرمز:


 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(); 

أركض الاختبارات. تم إجراء اختبار مجموعة القواعد مرة أخرى بنجاح ، ويبدو لي أنه يمكنني الآن بدء كتابة التعليمات البرمجية للإصدار الجديد فعليًا من طلب البيانات من قاعدة البيانات. هذه المرة لن أستخدم بناء جملة الفصل ، لأنني لا أرى أي مزايا من استخدامه. سيكون هناك الكثير من التعليمات البرمجية في آن واحد ، لأنني قمت بنسخ الجزء الذي تم اختباره بلا رحمة من تنفيذ الطلب الحالي ، مع استكماله بفحص ، في حالة استخراج السجل من قاعدة البيانات بالفعل ووضعه في حاوية الحالة. لذلك الرمز:


 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; 

تشغيل الاختبارات ... طبل لفة! وأرى خطًا من النقاط الخضراء. تم الانتهاء من جميع الاختبارات بنجاح. ولذا سأضيف اختبارًا آخر إلى المجموعة التي تتحقق من صحة معالجة الأخطاء ، حتى أنسى أنه لكي تتمكن DbMock الزائفة الخاصة بي من DbMock لإرجاع خطأ ، أحتاج أن أسألها عن إدخال DbMock Id يساوي 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(); } 

أركض الاختبارات مرة أخرى. كل شيء يعمل كما هو متوقع. يمكننا أن نفترض أن النموذج الأولي الصحيح لأمر الاستعلام إلى قاعدة البيانات جاهز والعودة إلى إعادة بناء وتطوير قواعد تكوين الاستعلامات ، لأنه أصبح من الواضح الآن أن التعليمات البرمجية لإنشاء مجموعة القواعد ستتوقف عن القراءة بعد إضافة المزيد من القواعد في نفس التنسيق.

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


All Articles