在测试和链码之间传递瞬态数据

时间:2019-03-07 20:13:55

标签: go hyperledger-fabric hyperledger-chaincode

据我所知,Fabric不支持使用MockStub测试私有数据集合。我下面尝试做的是通过将transient嵌入另一个结构中来解决MockStub上缺少MockStub字段的问题。

问题在于,在链码中,虽然我可以提取瞬态数据(stub.GetTransient()),但无法访问地图的所需字段。

这是我的结构:

type MockStubWithTransient struct {
    shim.MockStub
    transient map[string]interface{}
}

测试:

func TestCreatePOI (t *testing.T) {
    fmt.Println("Entering TestCreatePOI")
    stub := NewMockStubWithTransient("{\"poi\":{\"status\":\"unconfirmed\",\"id\":\"123\"}}")
    fmt.Println(stub)
    //  prints: &{{[] 0x158ffc0 mockStub map[] 0xc00014e960 map[]  <nil> <nil>  map[] map[] 0xc0000467e0 map[]} map[poi:map[status:unconfirmed id:123]]}
    // can access stub.transient["poi"]

    result := stub.MockInvoke("001",[][]byte{[]byte("CreatePOI")})
    fmt.Println(result)
}

func NewMockStubWithTransient(transient string) *MockStubWithTransient {
    var tMap map[string]interface{}
    _ := json.Unmarshal([]byte(transient), &tMap)
    s := shim.NewMockStub("mockStub", new(POIChaincode))
    st := &MockStubWithTransient{
        transient: tMap,
        MockStub: *s,
    }

    return st
}

当我在链码看到的情况下打印stub时,我得到:

&{[[67 114 101 97 116 101 80 114 111 111 102 79 102 73 110 115 117 114 97 110 99 101]] 0x158ffc0 mockStub map[] 0xc00014e960 map[] 001 seconds:1551988379 nanos:68249460  0xc0000c6190  map[] map[] 0xc0000467e0 map[]}

我可以打电话给stub.GetTransient(),但得到的是map[]

stub源自测试时,如何填充和访问stub的瞬态字段?

我没有设置这种处理方法,我只需要一种方法即可对利用私有数据集合的链代码进行单元测试。谢谢!

0 个答案:

没有答案