У меня есть простая функция, которая анализирует конфигурационный файл как JSON. Я хочу написать тест, который либо использует некоторые образцы статических файлов конфигурации, либо анализирует их, либо создает образцы во время теста и пытается их проанализировать.golang test temp directory
Это не совсем нужно вопрос, но здесь основной код:
// 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...
}
Тем не менее, мои конкретные вопросы:
- Есть ли место для статических активов (l ike примеры конфигурационных файлов), которые применимы только к тестам?
- Во время выполнения теста есть правильная (кросс-платформа, очищается с местом «go clean») для записи временных файлов?
(Примечание: Я бегу большинство моих вещей на Linux для постановки и производства и Mac для местного разработчика - так что использование/TMP/как временный каталог для тестов работает для меня на практике, но было интересно, если есть. лучший способ ...)
EDIT: Законченное использование этого подхода для теста:
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' для предоставления соответствующего тестового контента в самом тесте. – dyoo
Хм - это интересная идея ... Немного более громоздка для вызывающего, но в остальном, да, это будет работать в этом случае. –
Это не должно быть более громоздким для вызывающего. Файл * уже есть * io.Reader'. – MatrixFrog