我有一个简单的函数,可以将配置文件解析为 JSON。我想编写一个测试,它要么使用一些示例静态配置文件并解析它们,要么在测试期间创建示例并尝试解析它们。这个问题并非完全必要,但这里是基本代码:// config.go// ...(package,imports)...// Overall settings - corresponds to main.conftype MainSettings struct { // stuff}// Load main.conf from the specified file pathfunc 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.gofunc 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 接受 anio.Reader而不是 astring的建议也是一个好主意。
3 回答
慕神8447489
TA贡献1780条经验 获得超1个赞
只是为了与你所拥有的进行比较ioutil.TempDir,以下是与 的情况io.Reader:
// Load main.conf from the specified file path
func LoadMainSettings(src io.Reader) (*MainSettings, error) {
b, err := ioutil.ReadAll(src)
if err != nil { return nil, err }
r := &MainSettings{}
err = json.Unmarshal(b, r)
if err != nil { return nil, err }
return r, nil
}
具体来说,我们改变从参数path字符串的src io.Reader实例,我们在更换ioutil.ReadFile用ioutil.ReadAll。
您编写的测试用例最终会缩短一点,因为我们可以省去文件操作:
s, err := LoadMainSettings(strings.NewReader("{...sample config data...}"))
- 3 回答
- 0 关注
- 273 浏览
添加回答
举报
0/150
提交
取消