Supozoni se përballeni me një situatë ku duhet të shkruani disa teste njësi në pikën tuaj fundore që përdor një transaksion të bazës së të dhënave dhe ju përdorni bibliotekën knex si ndërtuesin e pyetjeve. Në atë rast, nëse biblioteka knex është ndërtuesi juaj i pyetjeve; ndoshta do të përfundoni duke tallur të gjitha pyetjet e transaksionit përmes knex-mock. Ky "mini-tutorial" do të shpjegojë se si të përdoret gjurmimi i pyetjeve të shumta të njëpasnjëshme dhe si funksionon ky funksion tallës nën kapuç.

Një hyrje e shpejtë për transaksionet e bazës së të dhënave

Një grup transaksioni i bazës së të dhënave është një grup detyrash të lidhura me zinxhir në një njësi të vetme ekzekutimi. Kjo do të thotë që transaksioni mund të përfundojë plotësisht vetëm pas të gjitha detyrave të suksesshme. Nëse DB has një gabim në ndonjë hap të detyrës, ajo do të kthehet në gjendjen e mëparshme pa ruajtur asnjë ndryshim. Kjo është e mirë për t'u përdorur, veçanërisht nëse përpiqeni të fshini skedarë të shumtë me një kërkesë. Duke përdorur transaksionet, mund të siguroheni që nuk do të djersiteni më vonë kur funksioni të ndeshet me një gabim, sepse asgjë nuk do të ndryshojë në bazën e të dhënave.

Pra, siç kemi përcaktuar, jeta juaj e devijimit është bërë tashmë më e lehtë falë transaksioneve, por duhet të pranoj se e pata më të ndërlikuar kur u përpoqa të tallja zbatimin tim. Prandaj, ja ku jemi.

Transaksionet e bazës së të dhënave me pyetje të shumta përdorin raste

Për të kuptuar më mirë se çfarë do të tallemi, le të përcaktojmë se çfarë do të bëjë pika jonë përfundimtare dhe si i përdor transaksionet.

Pra, le të supozojmë se pika jonë përfundimtare POST /api/v1/:userId?usersCatsColor%5B%5D=ginger?usersCatsColor%5B%5D=grey është thirrur dhe ne përdorim një transaksion të bazës së të dhënave për të përditësuar të dyja usersCatsColor që i përkasin një userId specifike

Transaksioni ynë do të kryejë hapat e dhënë:

  1. Ndizni një thirrje funksioni në GET api/v1/:userId?usersCatsColor për të përcaktuar nëse usersCatsColor të dhëna ekzistojnë
  2. Ndizni një thirrje funksioni te GET api/v1/usersCatsColorTypes për të parë nëse një ngjyrë e tillë lejohet
  3. Ndizni një thirrje funksioni në POST /api/v1/:userId?usersCatsColor me parametrat e dhënë të pyetjes për të ndryshuar ngjyrën e maceve

Siç mund ta shihni, tre pyetje duhet të kthejnë rezultatin e pritur për të ecur përpara. Nuk mund të ecësh përpara pa u kryer me sukses thirrja e mëparshme.

Tallja e një transaksioni të bazës së të dhënave me pyetje të shumta

Pra, si duhet të tallemi me transaksionin nëse kemi një zinxhir të tillë përgjegjësish? Nëpërmjet funksionit tallës Gjurmimi i pyetjeve të shumëfishta të njëpasnjëshme, i cili është i disponueshëm në skedarin knex-mock README.md:

... mock knex ...
... enable tracking ...

tracker.on('query', function sendResult(query, step) {
  [
    function firstQuery() {
      expect(query.sql).to.equal(... some SQL string ...);
      query.response([{id: 1}]);
    },
    function secondQuery() {
      expect(query.sql).to.equal(... some SQL string ...);
      query.response([{id: 2}]);
    }
  ][step - 1]();
});

Por çfarë bën realisht tracker.on()?

Le ta strukturojmë pak metodën, kështu që ne po kuptojmë plotësisht atë që po ndodh këtu:

tracker.on('query', function sendResult(query, step) {
...
}

Këtu ne thërrasim gjurmuesin për të ndezur një funksion që merr query dhe step si parametra. I gjithë funksioni ka nevojë për të, sepse më vonë, ai po e përdor atë për të:

  • gjurmoni pyetjet tona të transaksionit. query mund të përkthehet si një detyrë në zinxhirin tonë të transaksioneve. Është një objekt që përmban detaje të pyetjes
  • di numrin e hapave të ekzekutuar aktualisht. Është një numërues i thirrjeve ekzekutive që fillon nga 1 dhe rritet pasi çdo ngjarje query është emetuar

Më pas, një gjë që vlen të vihet re është se metoda .on() po mbështjell në një grup një grup funksionesh (firstQuery, secondQuery). Në varësi të zbatimit tonë, ne mund të kalojmë sa më shumë thirrje funksionesh që nevojiten në këtë grup. Ajo që ndodh këtu është se ato funksione ekzekutohen një nga një falë [step — 1]()

Nëse heqim "zhurmën", e gjithë receta e funksionit është se ai ekzekuton një funksion nga një objekt grupi

tracker.on('query', function sendResult(query, step) {
   [][]()
}

Është e ngjashme me:

const arrayOfArrays = [['A'], ['B'], ['C']]
const directArrayValue = arrayOfArrays[0][0]
console.log(directArrayValue)
// output
// "A"

Nëse në vend të vlerave [“A”], [“B”], and [“C”] do të kishim funksione në vend të tyre, atëherë do të ishim në gjendje t'i thërrisnim ato funksione nëpërmjet:

arrayOfArrays[0][0]()   OR   directArrayValue()

Shkrimi i testit të njësisë

Tani që kemi kuptuar se çfarë bën funksioni, jemi të lirë të vazhdojmë me zbatimin e testit tonë të njësisë!

Unë rekomandoj printimin e parametrit të pyetjes në trupin e funksionit sepse ai i qartëson gjërat. Nëse e kombinoni atë me korrigjuesin, gjithçka është brenda mundësive të dorës dhe mund të shihni se çfarë po ndodh në lëvizje. Në skenarin tonë të rremë, nëse dalim nga pyetja si kjo:

function getUsersCatsColorQuery() {    
   console.log(query)
}

dalja do të duket diçka si:

Vlera e transaksionit është false sepse ky funksion i veçantë nuk e nisi transaksionin në këtë skenar të rremë. Kur funksioni juaj thërret transaksionin, do të shihni diçka si:

Tani keni të gjitha pjesët e nevojshme për të ndjekur kodin tuaj dhe për të kthyer vlerat e duhura nga funksioni i tallur. Qasja ime ishte:

  1. Shtypni vlerat e pyetjes
  2. Shkoni te zbatimi aktual i funksionit për të parë se çfarë vlere duhet të kthehet
  3. Aplikoni çeqet expect
  4. Kaloni query.response(‘return-value’) nëse funksioni i tallur kthente diçka
  5. Krijo bllok të ri funksioni brenda metodës sime tracker.on()
  6. Shtypni vlerat e pyetjes në një bllok të ri funksioni

… dhe përsërisni nga hapi 2!

Me gjithë drejtësinë, duhet të jeni të kujdesshëm kur kaloni vlerat e pritshme të funksionit. Për shembull, nëse pritet një grup dhe ju jepni llojin e gabuar të vlerës, pyetja juaj e mëposhtme nuk do të ekzekutohet siç duhet. Ky informacion mund të duket i qartë, por unë kam dështuar shumë kur e kam bërë këtë dhe kam shpenzuar një kohë të mirë për korrigjimin e gabimeve.

Kështu që këshilla ime është: shkoni me durim hap pas hapi dhe argëtohuni! 💮