Clojure でいくつかのテストを作成しようとしています。これらのテストの 1 つは、実行中のテスト ファイルと同じディレクトリにある 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))
その場所でファイルを読み取ることができないため、IO エラーが発生します。私の次のアイデアは、現在の作業ディレクトリを取得し、それを相対パスに結合することでした。作業ディレクトリを取得する方法は次のとおりです。
(println (-> (java.io.File. ".")
.getCanonicalPath))
絶対パスを返したもの:
/Path-to-home/projects/demoproj
悪いことに、これら 2 つはファイルへの正しいパスに結合されません。test
間に欠けているコンポーネントがあります。したがって、これら 2 つのパスを結合すると、ディレクトリ パスが正しくなくなります。
それで、私の質問は、現在実行されているコード ファイルの絶対パスを取得する信頼できる方法はありますか? これが不可能な場合、このイディオムの代わりになるものは何でしょうか。つまり、テスト ファイルからの相対位置にあるファイルを解析するにはどうすればよいでしょうか?