不能进行测试:通话可能包含格式指令

时间:2019-08-28 16:10:27

标签: go

当对要通过设计进行测试的库中的函数的调用包含格式化指令时,

go test拒绝构建。这是故意的还是错误?无论哪种方式,都有解决方法吗?

请注意,与Call has possible formatting directive不同,这不是对不接受格式化指令的内置函数的调用。这是对我编写的函数的调用,该函数专门用于接受格式指令。

这是人为的但完整的复制品。注意makeError旨在处理格式字符串。 go build可以正常工作,但是go test会产生以下错误,并且不运行任何测试:

.\example.go:16:13: makeError call has possible formatting directive %v
FAIL    sandbox/example [build failed]

开始版本:go version go1.12.7 windows/amd64

example.go

package example

import "fmt"

type ErrExample struct {
    data interface{}
    msg  string
}

func (e *ErrExample) Error() string {
    return e.msg
}

func Divide(f1 float64, f2 float64) (float64, error) {
    if f2 == 0.0 {
        return 0, makeError(nil, "Cannot divide %v by 0", f1)
    }
    return f1 / f2, nil
}

func makeError(data interface{}, msgAndArgs ...interface{}) error {
    msg := ""
    switch len(msgAndArgs) {
    case 0:
        // Ignore
    case 1:
        msg = fmt.Sprint(msgAndArgs[0])
    default:
        if str, ok := msgAndArgs[0].(string); ok {
            msg = fmt.Sprintf(str, msgAndArgs[1:]...)
        }
        msg = fmt.Sprint(msgAndArgs...)
    }
    return &ErrExample{data: data, msg: msg}
}

example_test.go

package example

import (
    "testing"
)

func TestDivide(t *testing.T) {
    _, err := Divide(1230, 0)
    if err == nil {
        t.Errorf("Expected error when dividing by 0")
    }
}

1 个答案:

答案 0 :(得分:1)

转到测试的帮助文本中:

  

作为构建测试二进制文件的一部分,请在软件包上进行go run run vet   及其测试源文件来识别重大问题。如果去兽医   发现任何问题,进行测试报告,并且不运行测试   二进制只有默认的Govet Check的高可信度子集是   用过的。该子集是:“原子”,“布尔”,“ buildtags”,“ nilfunc”和   'printf'。您可以查看这些和其他兽医测试的文档   通过“ go doc cmd / vet”。要禁用Go vet的运行,请使用   -vet = off标志。”