【问题标题】:How to write a unit test for hyperledger/fabric-sdk-go?如何为 hyperledger/fabric-sdk-go 编写单元测试?
【发布时间】:2021-07-30 05:58:44
【问题描述】:

如何为以下代码编写单元测试 GetBook 函数是链码代码中的函数

func (svc *service) GetBook(_ context.Context, id string) (*Entity, error) {
    res, err := svc.contract.EvaluateTransaction("GetBook", id)
    if err != nil {
        return nil, fmt.Errorf("error on evaluate transaction: %w", err)
    }

    var rsp Entity

    err = json.Unmarshal(res, &rsp)
    if err != nil {
        return nil, fmt.Errorf("error on unmarshal json: %w", err)
    }

    return &rsp, nil
}

【问题讨论】:

标签: go hyperledger-fabric chaincode


【解决方案1】:

要对链代码进行单元测试,您需要使用counterfeiter,您可以使用它来生成contractapi和chaincodeStubs的所有模拟接口。这可以放在你的 xxxTest.go 文件中

//go:generate counterfeiter -o mocks/transaction.go -fake-name TransactionContext . transactionContext
type transactionContext interface {
    contractapi.TransactionContextInterface
}

//go:generate counterfeiter -o mocks/chaincodestub.go -fake-name ChaincodeStub . chaincodeStub
type chaincodeStub interface {
    shim.ChaincodeStubInterface
}

并导入生成的模拟接口编写单元测试

func TestReadCashWallet(t *testing.T) {
    chaincodeStub := &mocks.ChaincodeStub{}
    transactionContext := &mocks.TransactionContext{}
    transactionContext.GetStubReturns(chaincodeStub)

    cashWalletContract := chaincode.CashWalletContract{}
    cashwallet := &chaincode.CashWallet{
        ID: "id",
    }
    bytes, err := json.Marshal(cashwallet)
    require.NoError(t, err, "error json marshal")

    chaincodeStub.GetStateReturns(bytes, nil)
    res, err := cashWalletContract.ReadCashWallet(transactionContext, "id")
    require.EqualValues(t, cashwallet, res)

}

您必须模拟所有 shim 函数操作,例如 GetState、GetHistoryForKey、PutState 等。

fabric-samples here 中提供了更详细的示例。您可以克隆它并在 asset-transfer-private-data/chaincode-go

中使用仿冒者和单元测试示例查看完整的代码示例

【讨论】:

  • 我知道怎么写中文测试代码 下面的代码是用sdk和Chincode通信的 我写了一个中国的测试代码 但是我想写下面的sdk中的代码
【解决方案2】:
import (
    "context"
    "encoding/json"
    "fmt"
    "github.com/hyperledger/fabric-sdk-go/pkg/client/msp"
    "github.com/hyperledger/fabric-sdk-go/pkg/gateway"
)
func (svc *service) GetBook(_ context.Context, id string) (*Entity, error) {
    res, err := svc.contract.EvaluateTransaction("GetBook", id)
    if err != nil {
        return nil, fmt.Errorf("error on evaluate transaction: %w", err)
    }

    var rsp Entity

    err = json.Unmarshal(res, &rsp)
    if err != nil {
        return nil, fmt.Errorf("error on unmarshal json: %w", err)
    }

    return &rsp, nil
}```

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-28
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2022-01-24
    • 1970-01-01
    相关资源
    最近更新 更多