プライベートディレクトリで機能をテストする方法は?
-
12-10-2019 - |
質問
私は使用しています Matlab Xunit いくつかのコードをテストします。に含まれるいくつかの関数を直接呼び出すことができるようにしたい private
ディレクトリ。
簡単な複製可能なセットアップは次のとおりです。2つのフォルダーを備えたプロジェクトディレクトリを作成します code
と test
. 。の code
, 、名前のサブディレクトリを作成します private
したがって、ディレクトリツリーは次のように見えます
project_root
code
private
test
の中に code
ディレクトリは関数を配置します
function y = main()
y = sub();
end
の中に private
関数を配置します
function y = sub()
y = 123;
end
の中に test
関数を配置します
function testsub()
assertElementsAlmostEqual(sub(), 123);
end
次に、テスト監督と電話に移動します runtests
. 。あなたはそれを言っているエラーを見るはずです sub
未定義です。
private
Matlabパスではディレクトリが許可されていないため、オプションではありません。私はおそらく関数を置くことができます code
すべてのプライベート機能にハンドルを取得するDirはハッキングのようです。
プライベート機能をテストするためにアクセスするための最良の方法は何ですか?
編集:
プライベートディレクトリに移動するというアイデアには問題があります。理論的には、例えば呼び出すことができます
cd(privateDirectory);
suite = TestSuite.fromName(testDirectory);
suite.run
残念ながら、テストフレームワークは、電話をかけるとすぐにテストを含むディレクトリに移動します run
.
解決
1つの解決策は、からのプライベートディレクトリに移動することです 以内に testsub
, 、 入手する 関数ハンドル 使用したいプライベート機能に str2func, 、次に、その関数ハンドルを使用してテストを行うために戻ってナビゲートします。これらの手順を、ユニットテストのために別のヘルパー関数に配置することもできます。
function privateFcn = get_private_fcn(privateDir,fcnName)
oldDir = cd(privateDir); %# Change to the private directory
privateFcn = str2func(fcnName); %# Get a function handle
cd(oldDir); %# Change back to the original directory
end
そして、あなたはこの関数をで使用します testsub
次のように:
function testsub()
privateDir = '...\project_root\code\private'; %# The path to the private
%# directory
privateFcn = get_private_fcn(privateDir,'sub'); %# Call get_private_fcn
assertElementsAlmostEqual(privateFcn(), 123); %# Apply your test
end
これは機能しますが、Matlabの編集者は私に m-lint 関数を使用するための警告 CD: :「CD関数のMCCの使用には問題があります。」 1)機能以来、この警告を無視することは安全だと思います get_private_fcn
現在のディレクトリを変更してから、関数を処理してからすぐに戻します。2)あなたはそうではありません 展開されたアプリケーションを処理します.
他のヒント
検索パスにプライベートディレクトリを配置することはできませんが、プライベートディレクトリ自体にCDを使用できます。
そこにいると、Matlabは関数を表示し、それらを使用できます。これが私がプライベート機能で自分自身をテストする方法です。
プライベートディレクトリのポイントは、可視性が非常に限られている機能を持つことです。 code
. 。したがって、それらを見えるようにする公式の方法(少なくとも私が知っている)はありません。
ハンドルを何でも取得する関数 code/private
私にはそれをするための最もきれいな方法のようです。
別の方法は、配置することです testsub
中身 code
. 。これには、テスト機能が常にテストするはずのコードと一緒にあるという利点がありますが、このコードディレクトリを「汚染」すると感じるかもしれません。