Я пытаюсь написать несколько тестов с помощью Clojure. Один из этих тестов включает открытие html файла в том же каталоге, что и тестовый файл, для использования содержимого в качестве тестового ввода (широко используемая идиома в Python). Я думал, что *file*
var выполнит эту работу, но это не так, потому что это относительный.
Скажем, мой проект, использующий макет leiningen по умолчанию, называется demoproj
. Мои тесты затем находятся в ~/projects/demoproj/test
. Этот каталог снова повторяет пространство имен проектов, которое я не большой поклонник, но что бы то ни было. Итак, тесты для core.clj
находятся в ~/projects/demoproj/test/demoproj/test/core.clj
. У меня также есть файл под названием small_page.html
в том же каталоге. Если я поставлю следующее в test/core.clj
:
(println (-> (java.io.File. *file*)
.getPath))
Вот что я получаю:
demoproj/test/readibility.clj
Это относится к каталогу test
базы проекта. Я пробовал читать образец html-страницы, используя только этот относительный путь, следующим образом:
(slurp (-> (java.io.File. *file*)
.getParent
(java.io.File. "small_page.html")
.getPath))
Это вызывает ошибку ввода-вывода, поскольку файл не может быть прочитан в этом месте. Моя следующая идея заключалась в том, чтобы получить текущий рабочий каталог и присоединиться к нему с относительным путем. Вот как я загрузил рабочий каталог:
(println (-> (java.io.File. ".")
.getCanonicalPath))
Что вернул абсолютный путь:
/Path-to-home/projects/demoproj
Плохо, эти два не присоединяются к правильному пути к файлу; там отсутствует компонент test
. Таким образом, объединение этих двух путей приводит к неправильному пути к каталогу.
Итак, мой вопрос будет, есть ли надежный способ получить абсолютный путь к исполняемому файлу кода? И если это невозможно, что бы было альтернативой этой идиоме, т.е. Как я мог проанализировать файл, находящийся в местоположении относительно тестового файла?