モックShimを使用したチェーンコードのテスト

このテスト方法では、スタブshim.ChaincodeStubInterfaceのモック・バージョンを使用します。これを使用して、チェーンコードをOracle Blockchain Platformにデプロイする前にシミュレートできます。また、このライブラリを使用してチェーンコードのユニット・テストを構築することもできます。

  1. チェーンコード・ファイルの名前に対応するテスト・ファイルを作成します。
    たとえば、car_dealer.goがスマート・契約の実際の実装コードである場合、car_dealer.goのすべてのテストを含むcar_dealer_test.goというテスト・スイートを作成します。テスト・スイート・ファイル名は、*_test.go形式にする必要があります。
  2. package文およびimport文を作成します。
    package main
    
    import (
        "fmt"
        "testing"
    
        "github.com/hyperledger/fabric/core/chaincode/shim"
    )
  3. ユニット・テストを作成します。
    /*
    * 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)
        }
    }

ノート:

スタブのすべてのインタフェースが実装されるわけではありません。スタブ関数
  • GetQueryResult

  • GetHistoryForKey

はサポートされていないため、これらのいずれかをコールしようとするとエラーが発生します。