Unit testing 在go测试文件中使用包级别变量
我正试图为这样一个文件编写一个单元测试Unit testing 在go测试文件中使用包级别变量,unit-testing,go,go-testing,Unit Testing,Go,Go Testing,我正试图为这样一个文件编写一个单元测试 //file1.go var ( fileName = "/path/to/original/file.json" ) func DoSomething(){ // Read <fileName> and do some stuff } //file1.go 变量( fileName=“/path/to/original/file.json” ) func DoSomething(){ //阅读和做一些事
//file1.go
var (
fileName = "/path/to/original/file.json"
)
func DoSomething(){
// Read <fileName> and do some stuff
}
//file1.go
变量(
fileName=“/path/to/original/file.json”
)
func DoSomething(){
//阅读和做一些事情
}
但是对于单元测试,我想使用DoSomething()使用的/path/to/dummy/file.json
file1_test.go将与file.go位于同一个包中
为这个函数编写测试用例的正确方法是什么
将fileName变量修改为/path/to/dummy/file.json是一个好主意吗?或 我们是否应该修改file1.go以使其适合测试
这是使这些类型的值可配置的标准,以便在单元测试期间可以修改它们(例如,在本例中为文件名),还是我们应该修改我们的函数,以便它可以直接处理字节流数据,以便在测试期间可以直接提供虚拟数据?使用配置/设置结构。 在生产中,最好使用YAML保存配置值
type Config struct{FileName string}
总的来说,去吧
var conf Config
func main(){
conf = LoadConfigFromYaml()
DoSomething()
}
func DoSomething(){
// Read <fileName> from conf.FileName
}
它还允许您为每个测试设置不同的配置
更好的方法是创建一个库,在初始化时接受Config,并从main和测试中注入Config,避免使用
main-package
变量。如果没有共享var,您可以这样做:,或者只需将func更改为DoSomething(文件名字符串)
。“将fileName变量修改为/path/to/dummy/file.json是否是一个好主意?”当然是。
func TestSomething(t *testing.T){
conf = Config{FileName: "/path/to/dummy/file.json"}
DoSomething()
}