我有一个简单的函数,可以将配置文件解析为JSON格式。我想写一个测试来使用一些静态配置文件并对其进行解析,或者在测试期间创建样本并尝试对其进行解析。
这个问题并不是很重要,但以下是基本代码:
// config.go
// ...(package,imports)...
// Overall settings - corresponds to main.conf
type MainSettings struct {
// stuff
}
// Load main.conf from the specified file path
func LoadMainSettings(path string) (*MainSettings, error) {
b, err := ioutil.ReadFile(path)
if err != nil { return nil, err }
r := &MainSettings{}
err = json.Unmarshal(b, r)
if err != nil { return nil, err }
return r, nil
}
并且测试:
// config_test.go
func TestLoadMainSettings(t *testing.T) {
// possibly generate some example config files,
// or use static samples packaged with the source
s, err := LoadMainSettings("conf/main.conf") // <-- what should this path be??
if err != nil { panic(err) }
// more sanity checking...
}
话虽如此,我的具体问题是:
- 是否有适当的位置存放静态资源(例如示例配置文件),这些资源仅适用于测试?
- 在测试执行期间,是否有一个适当的(跨平台、随“go clean”清理)位置来写出临时文件?
(注意:我在 Linux 上运行大部分内容进行暂存和生产,并在本地开发时使用 Mac - 因此,在实践中,将 /tmp/ 作为测试的临时目录对我有效。但我想知道是否有更好的方法...)
编辑: 最终采用了这种方法进行测试:
f, err := ioutil.TempFile("", "testmainconf")
if err != nil { panic(err) }
defer syscall.Unlink(f.Name())
ioutil.WriteFile(f.Name(), []byte("{...sample config data...}"), 0644)
s, err := LoadMainSettings(f.Name())
另一个建议是将LoadMainSettings接受io.Reader
而不是string
,这个建议也很好。
io.Reader
?如果可以的话,那么你的测试用例就不需要依赖文件系统了,因为你可以在测试代码中使用strings.NewReader
来提供适当的测试内容。 - dyooio.Reader
。 - Tyler