如何解决如何为 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 举报,一经查实,本站将立刻删除。