Usar um Choque Simulado para Testar um Chaincode

Este método de teste envolve o uso de uma versão simulada do stub shim.ChaincodeStubInterface. Com isso, você pode simular algumas funcionalidades do seu chaincode antes de implantá-lo no Oracle Blockchain Platform. Você também pode usar essa biblioteca para criar testes de unidade para seu chaincode.

  1. Crie um arquivo de teste que corresponda ao nome do arquivo de chaincode.
    Por exemplo, se car_dealer.go for o código de implementação real de seu contrato inteligente, você criará um conjunto de testes chamado car_dealer_test.go contendo todos os testes de car_dealer.go. O nome do arquivo da suíte de teste deve estar no formato *_test.go.
  2. Crie seu pacote e instruções import.
    package main
    
    import (
        "fmt"
        "testing"
    
        "github.com/hyperledger/fabric/core/chaincode/shim"
    )
  3. Crie seu teste de unidade.
    /*
    * 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)
        }
    }

Observação:

Nem todas as interfaces do stub são implementadas. Funções Stub
  • GetQueryResult

  • GetHistoryForKey

não são suportados, e tentar chamar um desses resultará em um erro.