我有一个模块errs
,它定义了一个MultiError
,如下所示:
type MultiError []error
func NewMultiError(errs ...error) MultiError {}
// implementation omitted
我想测试Go Analyzer,要求MultiError
始终由errs.NewMultiError()
创建,而从不使用复合结构文字errs.MultiError{}
。编写分析器本身是直截了当的。
func run(pass *analysis.Pass) (interface{}, error) {
for _, f := range pass.Files {
ast.Inspect(f, func(n ast.Node) bool {
if l, ok := n.(*ast.CompositeLit); ok {
// Assume this does the right thing.
return checkCompositeLit(l, pass)
}
return true
})
}
return nil, nil
}
我尝试过的方法是使用伪造的errs
包在testdata
下创建一个源树。我更喜欢使用真正的errs
包,但我不知道如何使用:
来源树:
.
├── multi_error.go
├── multi_error_test.go
└── testdata
└── src
├── errs
│ └── errs.go
└── p
└── p.go
但是analysistest
似乎做了部分包加载,所以我不能依赖于包p
中的存根errs
包。
// testdata/src/p/p.go
package p
import (
"fmt"
)
func foo() {
me := errs.MultiError{} // want `found MultiError created from struct literal; use errs.NewMultiError() instead`
me2 := errs.NewMultiError()
fmt.Print(me, me2)
}
如何测试分析仪?是否可以使用真正的errs
包而不是存根进行测试?
修复是将import "errs"
添加到testdata/src/p/p.go
。然后在analysistest中修改模式。运行以包含testdata下的包errs
和p
。analysistest将正确地连接软件包。
func TestAll(t *testing.T) {
analysistest.Run(t, analysistest.TestData(), Analyzer, "p", "errs")
}