我正在使用MATLAB xUnit来测试一些代码。我希望能够直接调用private
目录中包含的一些函数。
这是一个简单的可复制设置:
使用两个文件夹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
个目录,因此这不是一个选项。我可以在code
目录中放置一个函数来检索所有私有函数的句柄,但这看起来很糟糕。
访问测试私有函数的最佳方法是什么?
编辑:
导航到私人目录的想法有问题。从理论上讲,我可以打电话,例如,
cd(privateDirectory);
suite = TestSuite.fromName(testDirectory);
suite.run
不幸的是,只要您调用run
,测试框架就会导航到包含测试的目录。
答案 0 :(得分:7)
一种解决方案是从 testsub
内的导航到私人目录,使用function handle获取所需的私有函数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的警告,但这是有效的:“MCC使用CD功能是有问题的。”我认为忽略此警告是安全的,因为1)函数get_private_fcn
更改当前目录,然后在获取函数句柄后立即将其更改回来2)您不是dealing with a deployed application。
答案 1 :(得分:3)
虽然您无法在搜索路径上放置私人目录,但您可以cd到私人目录本身。
在那里,MATLAB将看到这些功能,并且可以使用它们。这就是我在私人函数上测试自己的方法。
答案 2 :(得分:1)
私有目录的要点是具有非常有限的可见性的函数,即仅code
中的函数。因此,没有任何官方方式(至少我知道)使它们可见。
在code/private
中检索句柄的函数在我看来是最简洁的方法。
另一种方法是将testsub
放在code
内。这样做的好处是测试函数总是与他们应该测试的代码一起使用,但您可能会觉得这会“污染”您的代码目录。