Utiliser une simulation pour tester un code chaîne

Cette méthode de test implique l'utilisation d'une version simulée du stub shim.ChaincodeStubInterface. Vous pouvez ainsi simuler certaines fonctionnalités de votre code chaîne avant de le déployer sur Oracle Blockchain Platform. Vous pouvez également utiliser cette bibliothèque pour créer des tests unitaires pour votre code chaîne.

  1. Créez un fichier de test qui correspond au nom du fichier de code chaîne.
    Par exemple, si car_dealer.go est le code d'implémentation réel pour votre contrat intelligent, vous devez créer une suite de tests appelée car_dealer_test.go contenant tous les tests pour car_dealer.go. Le nom du fichier de la suite de tests doit être au format *_test.go.
  2. Créez votre package et vos instructions import.
    package main
    
    import (
        "fmt"
        "testing"
    
        "github.com/hyperledger/fabric/core/chaincode/shim"
    )
  3. Créez votre test d'unité.
    /*
    * TestInvokeInitVehiclePart simulates an initVehiclePart transaction on the CarDemo cahincode
     */
    func TestInvokeInitVehiclePart(t *testing.T) {
        fmt.Println("Entering TestInvokeInitVehiclePart")
    
        // Instantiate mockStub using CarDemo as the target chaincode to unit test
        stub := shim.NewMockStub("mockStub", new(CarDemo))
        if stub == nil {
            t.Fatalf("MockStub creation failed")
        }
    
        var serialNumber = "ser1234"
    
        // Here we perform a "mock invoke" to invoke the function "initVehiclePart" method with associated parameters
        // The first parameter is the function we are invoking
        result := stub.MockInvoke("001",
            [][]byte{[]byte("initVehiclePart"),
                []byte(serialNumber),
                []byte("tata"),
                []byte("1502688979"),
                []byte("airbag 2020"),
                []byte("aaimler ag / mercedes")})
    
        // We expect a shim.ok if all goes well
        if result.Status != shim.OK {
            t.Fatalf("Expected unauthorized user error to be returned")
        }
    
        // here we validate we can retrieve the vehiclePart object we just committed by serianNumber
        valAsbytes, err := stub.GetState(serialNumber)
        if err != nil {
            t.Errorf("Failed to get state for " + serialNumber)
        } else if valAsbytes == nil {
            t.Errorf("Vehicle part does not exist: " + serialNumber)
        }
    }

Remarques :

Toutes les interfaces du stub ne sont pas implémentées. Fonctions de stub
  • GetQueryResult

  • GetHistoryForKey

ne sont pas pris en charge et la tentative d'appel de l'un ou l'autre de ces éléments entraînera une erreur.