2 回答
TA贡献1828条经验 获得超4个赞
非 Go 文件和文件不会编译到模块中。若要发布文件,请将其重命名为文件,并导出要向客户端公开的变量和函数。_test.go_test.go.go
对于非 Go 文件,从 Go 1.16 开始,请嵌入它们:
package mycompany.com/common/testing
import _ "embed"
//go:embed responses/api.response.json
var MockApiJsonResponse []byte // or string
其中,目录树如下所示:
testing
└── testing.go
└── responses
└── api.response.json
然后,您的客户端将能够像往常一样引用这些导出的变量和函数:
package mycompany.com/service
import (
"testing"
common_testing "mycompany.com/common/testing"
)
func TestThings(t *testing.T) {
mock := common_testing.MockApiJsonResponse
// ...
}
TA贡献1842条经验 获得超12个赞
OP 答案!看来我的问题是我的软件包中有一个导入的实用程序fn,来自它自己的内部testing.go文件,这意味着它的init()函数正在运行并污染上游的pkg测试运行。apitest
我最初的方法很合理,但是在我删除了内部测试后,erptest pkg不再下载到上游服务。我更改了结构以引用根目录,如下所示,这恢复了 apitest pkg 的 upsrtream 下载:
/my-api-pkg
├── go.mod
└── /api
└── api.go
└── api_test.go // <= we currently access .json files here like utiltest.apiResponse []byte
└── /apitest // <= sub pkg that contains testing methods and .json accessors
└── apitest.go
└── /testing // <= moving the files here re-enabled download and access or erptest code to upstream consumers
└── /files
└── /api.response.json
这是我的apitest pkg导出的基本结构,以便通过以下方式访问上游的文件(作为[]字节)apitest.Domain().GetApiRoute1.Res1
// accessor
type domainAccessor struct {
GetApiRoute1 getApiRoute1
...
}
func DomainAccessor() domainAccessor {
return domainAccessor{
GetApiRoute1: _GetApiRoute1,
...
}
}
// individual file accessors for each route
type getApiRoute1 struct {
Res1 []byte
Res2 []byte
}
var _GetApiRoute1 = getApiRoute1{
Res1: loadFile("testing/files/api/v1/domain/getApiRoute1.res.json"),
Res2: loadFile("testing/files/api/v1/domain/getApiRoute2.res.json"),
}
加载文件 fn 将文件读取到 []byte
func loadFile(filepath string) []byte {
dir := ""
_, filename, _, ok := runtime.Caller(0)
if ok {
dir = path.Join(path.Dir(filename), "..", "..", "..")
}
fullPath := path.Join(dir, filepath)
body, err := ioutil.ReadFile(fullPath)
if err != nil {
log.Println("Error apitest.loadFile: unable to read file", err)
panic(err)
}
return body
}
- 2 回答
- 0 关注
- 83 浏览
添加回答
举报