8

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

这是一个简单的可复制设置:为自己创建一个项目目录,其中包含两个文件夹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未定义。

privatematlab 路径上不允许使用目录,因此这不是一个选项。我可能会在code目录中放置一个函数来检索所有私有函数的句柄,但这似乎很hacky。

访问测试私有功能的最佳方法是什么?

编辑:

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

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

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

4

3 回答 3

7

一种解决方案是从内部导航到私有目录,使用 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) 函数get_private_fcn会更改当前目录,然后在获取函数句柄后立即将其更改回来,并且 2) 您没有处理已部署的应用程序

于 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 回答