Из того, что я видел, 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
начинается в тесте?
Я не настроен на этот метод ведения дел, мне просто нужен способ модульного тестирования моего цепного кода, который использует частные коллекции данных. Спасибо!