Clojureでいくつかのテストを書こうとしています。これらのテストの1つは、実行中のテストファイルと同じディレクトリにhtmlファイルを開いて、その内容をテスト入力(Pythonで広く使われているイディオム)として使用することです。私は*file*
varが仕事をすると思っていましたが、それは相対的なので実際にはそうではありません。Clojureで実行中のコードと同じディレクトリにファイルをオープン
デフォルトの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つのパスに参加すると、不正なディレクトリパスが発生します。
私の質問は、現在実行されているコードファイルの絶対パスを取得する信頼できる方法ですか?これが不可能な場合、このイディオムの代替手段は何でしょうか。つまり、テストファイルに関連する場所にあるファイルをどのように解析できますか?