go - 具有公共构造函数的私有类型的表驱动测试
问题描述
我试图减少我的 API 的表面积,所以我使我的app
结构不导出(使用小写名称),并且只公开了New
函数:
package mylib
type app struct {
}
func New() *app {
return &app{}
}
但是现在,我想为这个东西写一个表驱动的测试,我不能mylib.app
在一个结构中保存一个:
package mylib_test
import (
"testing"
"mylib"
)
func TestApp(t *testing.T) {
tests := []struct {
name string
app private_type_public_new.app // This part doesn't work
}{
// ...
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
})
}
}
我有什么选择?我应该将应用程序结构公开(App
)并保留所有未导出的字段吗?我可以用高阶函数做一些有趣的事情来存储New
函数实例以在子测试中实例化应用程序吗?还有什么?
解决方案
我有什么选择?我应该将应用程序结构公开(App)并保留所有未导出的字段吗?
是的,将其导出为App
. golang/lint
(现已弃用)特别警告引用未导出类型的导出函数,因为它们很难让您的包的消费者使用。例如,如果你指定x := mylib.New()
了一个 ,x
的实例,除了它的类型之外*myapp.app
,go-pls
不会显示任何关于这个变量的信息,这意味着你附加到它的任何描述性注释都不会出现。
推荐阅读
- arrays - Angular PrimeNG DataTable 将嵌套的 JSON 显示为一列中的自定义字符串
- c# - Cosmo Sql Db - 使用延续令牌查询数据永远不会完成
- python - 在 NumPy 中将单列添加到矩阵中
- oracle - ORA-00904:“PSTATUSTYPE”:无效标识符 00904。00000 -“%s:无效标识符”*原因:*操作:第 67 行错误,第 11 列
- maven-3 - zeppelin-python 测试失败
- netfilter - 如何在 Ubuntu 18.04 上使用 libnetfilter_conntrack
- angularjs - 在angular js中使用ng repeat分别访问动态输入文本控制文本
- amazon-web-services - 在 Lightsail 中存在 SSL 问题的 AWS 云端 - 重定向
- mysql - MySQL 触发器在后续查询中没有识别 NEW.entity?
- php - 选择框中间出现意外的空白选项