Пройдите модульное тестирование, не найдя нужный файл - PullRequest
0 голосов
/ 28 сентября 2018

Я написал модульный тест в go, и метод init этого же файла открывает файл в корне проекта.Проблема, с которой я сталкиваюсь, заключается в том, что при запуске теста пакет теста является корневым каталогом, который не содержит требуемый файл.Как настроить тестовую функцию на просмотр файла без создания дубликата файла в каталоге тестового файла?

Структура файла:

main.go
|+-helpers
   |+-data.go
   |+-data_test.go
required_file.txt

Команда тестирования:

go test github.com/testproj/helpers

Код в data.go:

func init() {
    file, err := os.Open("required_file.txt") 
      if err != nil {
        log.Fatal(err) <-- required_file.txt not found
      }
}

1 Ответ

0 голосов
/ 28 сентября 2018

Ваша основная проблема в том, что у вас есть два разных пакета, которые слишком тесно связаны.Если у вас есть пакет, который зависит от его работы с ресурсом, содержащимся в другом пакете, то на самом деле либо:

  1. Они не должны быть двумя разными пакетами;или
  2. Вам необходимо их дополнительно развязать.

Таким образом, у вас есть несколько вариантов здесь:

  1. Просто нетотдельный пакет "помощников".Если функциональные возможности в этом пакете не имеют иной цели, кроме как помочь с основным пакетом, то объедините их, поскольку концептуально они недостаточно независимы, чтобы быть отдельными пакетами.Как вы видите, использование папок просто в качестве средства для организации кода - не такая хорошая идея в Go, как в некоторых других языках.

  2. Полное определение имени файлас абсолютным путем как в вашем основном, так и в вашем пакете помощников.Если действительно верно, что два независимых пакета зависят от одного и того же файла, то оба должны иметь возможность найти его независимо от того, где находится какой-либо пакет, и для этого требуется абсолютный путь.Это, вероятно, ваше наименее оптимальное решение.

  3. Далее отсоедините пакет помощников, чтобы он больше не зависел от этого файла, возможно с помощью:

    • .полное имя файла в вашем основном пакете и передача его функциям в вашем пакете помощников при вызове;
    • открытие файла в основном пакете и передача io.Reader файлу функциямв вашем пакете помощников, когда вы вызываете их;
    • открывая файл в вашем основном пакете и передавая содержимое файла функциям в вашем пакете помощников, когда вы вызываете их, возможно, в виде буфера bytes;или
    • извлеките нужную информацию из файла в вашем основном пакете и передайте только эту соответствующую информацию функциям в вашем пакете помощников при вызове.

Обратите внимание, что с этим подходом вы все равно столкнетесь с проблемами.Когда вы запускаете свое основное приложение, ваш текущий рабочий каталог по умолчанию будет тем каталогом, в котором вы находитесь в данный момент, когда вы запускаете программу.Поэтому, если вы не укажете полностью имя файла, то, как только вы запустите свое приложение из любого каталога, кроме того, в котором находится ваш исходный код, он не сможет найти нужный файл.

...