go test单元测试变量undefined错误

背景

第一次开发需求的时候遇到的问题,用go test xxx_test.go xxx.go的命令执行单个测试文件的时候,在xxx.go中可能引用到包下其他文件的变量,这时候编译就会报错:变量undefined。

解决方法

如果引用的文件不太多的话,把所有用到的文件一同编译就行了。如xxx.go文件中用到了aaa.go中的变量,那执行

go test xxx_test.go xxx.go aaa.go

如果是引用关系比较复杂,存在多级引用,建议直接在包目录下执行go test,运行该包下所有的测试文件。

### 关于Hyperledger Go语言智能合约教程 #### 编写环境设置 为了使用Go语言编写Hyperledger Fabric上的智能合约,开发者需先安装并配置好Fabric SDK以及Golang开发环境。这通常涉及下载官方提供的样例网络和链码模板,并确保本地环境中已正确设置了GOPATH和其他必要的编译工具[^3]。 #### 链码结构介绍 在Hyperledger Fabric架构里,智能合约被称为“链码”。一个典型的基于Go实现的链码文件会导入`github.com/hyperledger/fabric-chaincode-go/shim`包以及其他辅助库来处理业务逻辑。通过继承自`shim.Chaincode`类定义新的链码实例,在其中重载Init()函数用于初始化操作而Invoke()则负责响应交易请求。 ```go // 定义一个新的链码类型 type SimpleChaincode struct { } func (t *SimpleChaincode) Init(stub shim.ChaincodeStubInterface) pb.Response { // 初始化代码... } func (t *SimpleChaincode) Invoke(stub shim.ChaincodeStubInterface) pb.Response { function, args := stub.GetFunctionAndParameters() switch function { case "invoke": return t.invoke(stub, args) default: fmt.Println(" invokesmartcontract invoke undefined function name:" + function) res := "{\"Error\": \"Undefined function names\"}" payload := []byte(res) return shim.Error(string(payload)) } } ``` #### API调用说明 对于账本数据的操作,如读取、更新状态变量等动作均依赖于`ChaincodeStubInterface`所提供的API集合完成。例如PutState(), GetState()方法允许向分布式账本存储键值对或者从中检索特定记录;Query接口支持更复杂的查询需求,比如范围扫描或是条件过滤等功能。 ```go key := "exampleKey" value := "exampleValue" err = stub.PutState(key, []byte(value)) // 将 key-value 对存入账本 if err != nil { jsonResp := "{\"Error\":\"Failed to put state for " + key + "\"}" return shim.Error(jsonResp) } valAsbytes, _ := stub.GetState(key) // 获取指定 key 下的数据 fmt.Printf("- getExample value: %s\n", valAsbytes) iterator, err := stub.GetHistoryForKey(key) // 查询某个 key 的历史版本变更情况 defer iterator.Close() for iterator.HasNext() { queryResponse, err := iterator.Next() if err != nil { return shim.Error(err.Error()) } fmt.Printf("Record is %v\n", string(queryResponse.Value)) } ``` #### 单元测试实践 针对上述提到的各种功能模块,可以通过构建模拟环境来进行充分验证而不必实际部署到生产节点上运行。借助第三方框架如Testify简化断言过程,同时利用Mock对象替代真实组件以便更好地控制输入输出行为从而达到更高的覆盖率目标[^1]。 ```go import ( "testing" "github.com/stretchr/testify/assert" pb "github.com/hyperledger/fabric/protos/peer" ) func TestGetSet(t *testing.T){ cc := new(SimpleChaincode) mockStub := mock.NewMockStub("testchaincodename", cc) key := "test-key" value := "test-value" response := mockStub.MockTransactionStart("txid") expectedPayload := []byte{} assert.Equal(t, expectedPayload, response.Payload) response = mockStub.Invoke(mock.NewMockTransactionContext(nil), [][]byte{[]byte("set"), []byte(key), []byte(value)}) assert.Nil(t, response.Payload) response = mockStub.Invoke(mock.NewMockTransactionContext(nil), [][]byte{[]byte("get"), []byte(key)}) actualVal := string(response.Payload) assert.Equal(t, actualVal, value) } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值