Mock Shim을 사용하여 체인코드 테스트

이 테스트 방법은 스텁 shim.ChaincodeStubInterface의 모의 버전을 사용하는 것입니다. 이를 통해 체인코드를 Oracle Blockchain Platform에 배포하기 전에 일부 기능들을 시뮬레이션할 수 있습니다. 이 라이브러리를 사용하여 체인코드에 대한 단위 테스트를 작성할 수도 있습니다.

  1. 체인 코드 파일의 이름과 일치하는 테스트 파일을 생성합니다.
    예를 들어, car_dealer.go가 스마트 계약에 대한 실제 구현 코드인 경우 car_dealer.go에 대한 모든 테스트가 포함된 car_dealer_test.go라는 테스트 모음을 생성합니다. 테스트 모음 파일 이름은 *_test.go 형식이어야 합니다.
  2. 패키지 및 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

지원되지 않으므로 이 중 하나를 호출하려고 하면 오류가 발생합니다.