Sådan begynder du at teste din Hyperledger Fabric Nodejs-kædekode

Bemærk: Siden skrivningen af ​​denne artikel har vores modul gennemgået nogle ændringer og opdateringer. Kontroller github for den nyeste info.

Denne artikel er en anden del af vores "hvordan man Hyperledger Fabric nodejs chaincode" -artikler. Sidste artikel handlede om at udvikle kædekoden, som vi skrev en pakke til. Det gør det meget hurtigere at skrive kædekode.

Der var ikke nogen god løsning til test af nodejs-kædekode endnu. Dette er grunden til, at vi oprettede mockstub-pakken. For at være ærlig kan jeg heller ikke lide at teste. Men da opgradering af kædekode ikke er den hurtigste ting i verden, er der meget tid til at gemme test. Mere vigtigere er det, da Blockchain er uforanderlig og formodes at være sikker, fordi koden findes på netværket, efterlader vi hellere ikke fejl i vores kode.

Test ved hjælp af vores mockstub

Denne ChaincodeMockStub er en ujævn implementering af stoff-shim-stubben. Dette betyder, at du kan teste din kædekode uden egentlig at starte dit netværk. Det implementerer næsten hver funktion, som den faktiske stub udfører, men i hukommelsen. Kun disse funktioner understøttes (endnu) ikke: getHistoryForKey, getBinding, getTransient, setEvent, getChannelID.

Sådan testes

garn tilføj @ theledger / fabric-mock-stub - dev

Test af Nodejs-kædekode fungerer på samme måde som testning ved hjælp af mockstub i Golang-kædekoden. ChaincodeMockStub har 2 vigtige mock-funktioner mockInitand mockInvoke. Ved at videregive din kædekode, vil den spotte en transaktion og udføre en påkaldelse / init på lignende måde som den oprindeligt vil blive kaldt.

Respons

Begge disse funktioner returnerer en ChaincodeResponse. Ved hjælp af dette ChaincodeResponse-objekt kan vi teste, om handlingen returnerede et forventet resultat eller ej.

Ved succes vil svaret se sådan ud. Den returnerer altid en status, og hvis metoden returnerer noget, vil svaret også indeholde en nyttelast.

{
    "status": 200,
    "nyttelast": 
}

Ved fejl ser svaret sådan ud. Nyttelasten erstattes af et meddelelsesfelt, der indeholder fejlen.

{
    "status": 500,
    "besked": 
}

Du kan validere svaret ved hjælp af noget som chai. Den transformering, der bruges her, er en hjælper, der leveres med mockstuben for let at serialisere og deserialisere data.

Medtag din kædekode

Øverst i din testfil kan du importere og øjeblikkelig din kædekode, dette skal kun gøres én gang. Sørg for at adskille shim.start () fra din kædekode. Ellers udføres det før test, og der vil opstå fejl. Et eksempel kan findes i vores netværkskedelplade.

Medtag mockstub

Efter dette kan du i dine test oprette en ny mockstub. Du skal give et tilfældigt navn (ikke vigtigt i øjeblikket) og din kædekode.

Det er op til dig, hvis du vil oprette en ny mockstub til hver test eller have en delt til alle test. Deling af en til alle testene holder din tidligere tilstand i hukommelsen. Hvis du ikke ønsker dette, skal du oprette en ny til hver test. Husk dette.

Eksempel

En test ville se sådan ud. Nu har vi bare brug for noget testlogik.

Test Init

Metoden Init () kan testes ved hjælp af funktionen mockStub.mockInit (txId: string, args: string []). Det opretter en ny spottransaktion og kalder init-metoden på din kædekode. Da init sker, når din kædekode instantiseres, ønsker du generelt ikke, at den skal returnere noget. Så vi tjekker responsstatus her.

Testkald

Metoden Invoke () kan testes ved hjælp af mockStub.mockInvoke (txId: streng, args: string []) -funktionen. Det opretter en ny spottransaktion og kalder påkaldelsesmetoden på din kædekode. Klienten sender enten en forespørgsel eller en påkaldelse, men kædekoden accepterer disse begge som påkaldelse. I dine test er der ikke nogen forskel, både påkald og forespørgsler kan returnere et resultat.

TestforespørgselBil

Test createCar

TheLedger - Blockchain-eksperter / konsulenter i Belgien og Holland.

Test af individuelle klasser

Det kræves ikke kun at teste ved hjælp af mockInvoke og mockInit. Du kan ringe direkte til metoderne på din kædekode eller på mockStub, hvis du virkelig vil.

Test direkte ved hjælp af Mychaincode

En bemærkning, når du bruger denne, afhængigt af hvad du returnerer i din funktion, vil du være i stand til at modtage en buffer eller et objekt i dine test. Dette diskuteres øverst i dette blogindlæg.

Konklusion

Jeg hører dig, jeg hader også at skrive prøver. Men jeg tror, ​​at stofskib virkelig havde brug for dette. Jeg vil gerne tilføje det til den faktiske stof-shim-pakke til sidst, svarende til mockstubben, der leveres med Golang-shim. Eller i det mindste flytte vedligeholdelsen over til Hyperledger-fundamentet. For at gøre dette er der stadig et par funktioner til at implementere. Og pakken skal testes grundigt, så jeg opfordrer dig til at bidrage til den! #makeTestingGreatAgain

Vi er ikke kun specialiserede i Hyperledger Fabric. Vi udfører også toksalg, smarte kontraktrevisioner og andre seje ting. Kom i kontakt med TheLedger.

Hvad skal jeg læse næste

→ Hyperledger Stof & sovesofa, fantastiske forespørgsler og hvor man kan finde ...

→ Sammensat liste over ressourcer i Hyperledger Fabric

→ Bring-Your-Own-Standard på Blockchain