测试golang分析仪的生产包使用情况



我有一个模块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下的包errsp。analysistest将正确地连接软件包。

func TestAll(t *testing.T) {
analysistest.Run(t, analysistest.TestData(), Analyzer, "p", "errs")
}

相关内容

  • 没有找到相关文章

最新更新