测试golang函数中无法访问的执行路径



我正在编写单元测试,以覆盖下面结构链代码中的所有执行路径。但我看不出有什么方法可以达到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")
}
当无法封送数据中的值时,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)
    

最新更新