8

私はMATLABxUnitを使用していくつかのコードをテストしています。privateディレクトリ に含まれているいくつかの関数を直接呼び出せるようにしたいと思います。

簡単な複製可能なセットアップは次のとおりです。2つのフォルダcodeとを含むプロジェクトディレクトリを自分で作成しますtest。でcode、という名前のサブディレクトリを作成して、ディレクトリprivateツリーが次のようになるようにします。

project_root
  code
    private
  test

codeディレクトリに関数を配置します

function y = main()
y = sub();
end

privatedirに関数を配置します

function y = sub()
y = 123;
end

testdirに関数を配置します

function testsub()
assertElementsAlmostEqual(sub(), 123);
end

次に、テストディレクトリに移動して、を呼び出しますruntestssub未定義であるというエラーが表示されるはずです。

privatematlabパスではディレクトリが許可されていないため、これはオプションではありません。すべてのプライベート関数へのハンドルを取得する関数をdirに配置することもできcodeますが、これはハッキーのようです。

プライベート機能をテストするためのアクセスを取得するための最良の方法は何ですか?

編集:

プライベートディレクトリに移動するという考えには問題があります。理論的には、例えば、

cd(privateDirectory);
suite = TestSuite.fromName(testDirectory);
suite.run

残念ながら、テストフレームワークは、を呼び出すとすぐにテストを含むディレクトリに移動しますrun

4

3 に答える 3

7

1つの解決策は、内部 からプライベートディレクトリに移動し、STR2FUNCを使用して目的のプライベート関数への関数ハンドルtestsubを取得してから、戻ってその関数ハンドルを使用してテストを実行することです。次のように、これらの手順を単体テスト用の別のヘルパー関数に入れることもできます。

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エディターは関数CDを使用するためのM-Lint警告を表示します:「MCCでのCD関数の使用には問題があります。」1)関数が現在のディレクトリを変更し、関数ハンドルを取得するとすぐに元に戻すため、2)デプロイされたアプリケーションを処理していないため、この警告を無視しても安全だと思います。get_private_fcn

于 2010-12-21T15:56:01.330 に答える
3

検索パスにプライベートディレクトリを配置することはできませんが、プライベートディレクトリ自体にcdすることはできます。

そこに到達すると、MATLABは関数を認識し、それらを使用できるようになります。これは私がプライベート関数で自分自身をテストする方法です。

于 2010-12-21T14:17:23.687 に答える
1

プライベートディレクトリのポイントは、可視性が非常に制限されている関数、つまりの関数のみを持つことですcode。したがって、それらを表示するための公式の方法(少なくとも私が知っている方法)はありません。

入っているものすべてのハンドルを取得する関数は、code/private私にはそれを実行するための最もクリーンな方法のようです。

testsub別の方法は、内部に配置することcodeです。これには、テスト関数が常にテスト対象のコードと一緒になっているという利点がありますが、これがコードディレクトリを「汚染」していると感じる場合があります。

于 2010-12-21T14:16:35.717 に答える