如何在私人目录中测试功能?

Ric*_*ton 8 matlab unit-testing xunit

我正在使用MATLAB xUnit来测试一些代码.我希望能够直接调用private目录中包含的某些函数.

这里有一个简单的复制设置:有两个文件夹中创建自己的项目目录codetest.在code,创建一个名为的子目录,private以便目录树看起来像

project_root
  code
    private
  test
Run Code Online (Sandbox Code Playgroud)

code目录中放置一个函数

function y = main()
y = sub();
end
Run Code Online (Sandbox Code Playgroud)

privatedir放置一个函数

function y = sub()
y = 123;
end
Run Code Online (Sandbox Code Playgroud)

testdir放置一个函数

function testsub()
assertElementsAlmostEqual(sub(), 123);
end
Run Code Online (Sandbox Code Playgroud)

现在导航到测试目录并调用runtests.您应该看到一个错误,说明sub未定义.

privatematlab路径上不允许使用目录,因此这不是一个选项.我可以在codedir中放一个函数来检索所有私有函数的句柄,但这看起来很糟糕.

访问测试私有函数的最佳方法是什么?

编辑:

导航到私人目录的想法有问题.理论上我可以打电话,例如,

cd(privateDirectory);
suite = TestSuite.fromName(testDirectory);
suite.run
Run Code Online (Sandbox Code Playgroud)

不幸的是,一旦调用,测试框架就会导航到包含测试的目录run.

gno*_*ice 7

一种解决方案是从内部 导航到私有目录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
Run Code Online (Sandbox Code Playgroud)

你可以使用这个函数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
Run Code Online (Sandbox Code Playgroud)

这是有效的,虽然MATLAB编辑器给我一个M-Lint警告使用功能CD:"MCC使用CD功能是有问题的." 我认为忽略此警告是安全的,因为1)该函数get_private_fcn更改了当前目录,然后在获取函数句柄后立即将其更改回来,2)您没有处理已部署的应用程序.