微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何为 hyperledger/fabric-sdk-go 编写单元测试?

如何解决如何为 hyperledger/fabric-sdk-go 编写单元测试?

如何为以下代码编写单元测试 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
}

解决方法

要对chaincode运行单元测试,您需要使用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)

}

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

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

中使用伪造者和单元测试示例来查看完整的代码示例 ,
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
}```

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。