質問

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

簡単な複製可能なセットアップは次のとおりです。2つのフォルダーを備えたプロジェクトディレクトリを作成します codetest. 。の 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. 。これには、テスト機能が常にテストするはずのコードと一緒にあるという利点がありますが、このコードディレクトリを「汚染」すると感じるかもしれません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top