Загрузка файлов данных в разных тестах в Голанге - PullRequest
0 голосов
/ 19 октября 2019

У меня есть структура каталогов, например:

./gen/items/items.go
./gen/items/items_test.go
./gen/items/data/items.xml
./engine/action/actions_test.go

В items.go У меня есть метод, который должен запускаться один раз, и заполнить некоторую структуру данных элементами, загруженными из items.xml. Я делаю это с абсолютным путем, который работает, когда код выполняется в items_test.go, так как я предполагаю, что текущий рабочий каталог в go test является корнем пакета текущего протестированного пакета.

itemsXMLPath := "./data/items.xml"
absPath, err := path.Abs(itemsXMLPath)
if err != nil {
    ...
}
bytes, err := ioutil.ReadFile(absPath)

YouЗдесь можно понять, почему абсолютный путь ./data/items.xml отлично работает из gen/items dir.

Если я запускаю тесты в actions_tests.go, он пытается использовать относительный путь из action и терпит неудачу, потому что нетdata dir в action.

Когда я вызываю мой метод loadFromXML в items.go, я хочу, чтобы он всегда использовал относительный путь из items dir, который будетпоиск по каталогу данных ниже.

Я предположил, что поскольку вызывающий код находится в items.go, путь будет идти оттуда, но, похоже, он использует рабочий каталог тестового бегуна или бегунка go(если я запускаю main.go).

Есть ли способ убедиться, что в тестовом прогоне или из основного прогона функция загрузки xml использует относительный путь из непротиворечивого каталога в репозитории (например, как бы я последовательно находил пакет rootn запускается из MAIN или из теста).

Я уверен, что есть способ достичь этого без дублирования тестовых данных или без передачи относительного пути к функции loadFromXML, которая должна быть настроена на основегде метод вызывается!

1 Ответ

0 голосов
/ 19 октября 2019

В итоге я просто написал функцию, которая может найти корневой каталог из любой работающей папки в проекте, а затем я могу применить относительный путь оттуда. Кажется, работает с основного или тестового запуска.

func getRootPath() string {
    dir, err := os.Getwd()
    if err != nil {
        log.Fatal(err)
    }

    // Check if already in root directory (e.g. main.go)
    lastSlashIndex := strings.LastIndex(dir, "/")
    cName := dir[lastSlashIndex+1:]
    if cName == "#root-folder-name#" {
        return dir
    }

    // Get parent directory
    parent := filepath.Dir(dir)
    lastSlashIndex = strings.LastIndex(parent, "/")
    pName := parent[lastSlashIndex+1:]

    // If not at root, continue getting parent
    for pName != "#root-folder-name#" {
        parent = filepath.Dir(parent)
        lastSlashIndex = strings.LastIndex(parent, "/")
        pName = parent[lastSlashIndex+1:]
    }
    return parent
}

Затем я могу объединить этот каталог с относительным путем и использовать его в filepath.Abs

itemsXMLPath := getRootPath() + "/folder/path/data/items.xml"
absPath, err := filepath.Abs(itemsXMLPath)
...