Mock Shim verwenden, um einen Chaincode zu testen

Bei dieser Testmethode wird eine Mockversion des shim.ChaincodeStubInterface-Stubs verwendet. Damit können Sie einige Funktionen Ihres Chaincodes simulieren, bevor Sie ihn in Oracle Blockchain Platform bereitstellen. Sie können diese Bibliothek auch verwenden, um Einheitentests für Ihren Chaincode zu erstellen.

  1. Erstellen Sie eine Testdatei, die dem Namen der Chaincode-Datei entspricht.
    Beispiel: Wenn car_dealer.go der tatsächliche Implementierungscode für Ihren Smart Contract ist, erstellen Sie eine Testsuite mit dem Namen car_dealer_test.go, die alle Tests für car_dealer.go enthält. Verwenden Sie das *_test.go-Format für den Testsuite-Dateinamen.
  2. Erstellen Sie Ihr Paket, und importieren Sie Anweisungen.
    package main
    
    import (
        "fmt"
        "testing"
    
        "github.com/hyperledger/fabric/core/chaincode/shim"
    )
  3. Erstellen Sie Ihren Unit-Test.
    /*
    * TestInvokeInitVehiclePart simulates an initVehiclePart transaction on the CarDemo cahincode
     */
    func TestInvokeInitVehiclePart(t *testing.T) {
        fmt.Println("Entering TestInvokeInitVehiclePart")
    
        // Deploy 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)
        }
    }

Hinweis:

Nicht alle Schnittstellen des Stubs sind implementiert. Die folgenden Stub-Funktionen werden nicht unterstützt.
  • GetQueryResult

  • GetHistoryForKey

Der Versuch, eine dieser Funktionen aufzurufen, führt zu einem Fehler.