据我所知,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
的瞬态字段?
我没有设置这种处理方法,我只需要一种方法即可对利用私有数据集合的链代码进行单元测试。谢谢!