我正在撰寫單元測驗來覆寫下面結構鏈代碼中的所有執行路徑。但我沒有看到到達 JSON.Marshall 失敗路徑的方法。
我如何傳遞一個傳遞給json.Unmarshal但它失敗的值json.Marshal?
func (c *MyContract) CreateAsset(ctx contractapi.TransactionContextInterface, values string) (bool, error) {
doctype := "myAsset"
txData := []byte(values)
docData := new(DocData)
docData.DataType = doctype
// validate json input & map to struct
err := json.Unmarshal(txData, &docData)
if err != nil {
return false, fmt.Errorf("failed docData unmarshalling: %s", err.Error())
}
docKey, _ := createKey(ctx, doctype, []string{docData.Key1, docData.Key2})
exists, err := c.DocExists(ctx, docKey)
if err != nil {
return false, fmt.Errorf("could not read from world state %s", err)
} else if exists {
return false, fmt.Errorf("asset already exists")
}
txBytes, err := json.Marshal(docData)
if err != nil {
return false, fmt.Errorf("failed docData bytes marshalling: %s", err.Error())
}
return true, ctx.GetStub().PutState(docKey, txBytes)
}
這是我目前的測驗:
func TestCreateAsset(t *testing.T) {
var err error
ctx, _ := setupStub()
c := new(MyContract)
_, err = c.CreateAsset(ctx, "{")
assert.EqualError(t, err, "failed unmarshalling: unexpected end of JSON input", "testing malformed json")
_, err = c.CreateAsset(ctx, "{\"key1\":\"mis\",\"key2\":\"sing\"}")
assert.EqualError(t, err, "could not read from world state some failure")
_, err = c.CreateAsset(ctx, "{\"key1\":\"001\",\"key2\":\"002\"}")
assert.EqualError(t, err, "asset already exists")
}
uj5u.com熱心網友回復:
json.Marshal當資料中的值無法編組時,該函式將失敗。導致失敗的唯一方法是引入一個測驗場并在測驗期間滑入錯誤值:
type DocData struct {
…
Test interface{} `json:"test,omitempty"`
}
…
var induceFailure interface{}
…
docData.Test = induceFailure
txBytes, err := json.Marshal(docData)
if err != nil {
return false, fmt.Errorf("failed docData bytes marshalling: %s", err.Error())
}
…
func TestMarshlFail(t *testing.T) {
induceFailure = make(chan struct{})
defer func() {
induceFailure= nil
}()
…
在該行代碼上獲得測驗覆寫率可能不值得。
與手頭的問題無關,這里有一些對您的代碼的改進。
包裝錯誤而不是將錯誤轉換為字串:
return nil, fmt.Errorf("failed docData unmarshalling: %w", err)因為
docData是指標,解組時不需要取值的地址。err := json.Unmarshal(txData, docData)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/352550.html
