如何为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运行单元测试,您需要使用伪造器,您可以使用它来生成contractapi和chaincodestub的所有模拟接口。这可以放在你的xxxTest中。去文件

//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等

此处的织物样本中提供了更详细的示例。您可以克隆此代码,并在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
}```

最新更新