如何测试私有目录中的函数?

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未定义。

private目录不允许在matlab路径上,因此这不是一个选项。可能可以将一个函数放在code目录中,以检索所有私有函数的句柄,但这似乎有些繁琐。

如何最好地获得访问私有函数的权限?

编辑:

进入私有目录的想法存在问题。理论上,我可以调用,例如:

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

不幸的是,测试框架在调用 run 后立即导航到包含测试的目录。

3个回答

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

你可以在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)你不需要处理部署应用程序


3

虽然你不能将私有目录放在搜索路径上,但你可以cd到私有目录本身。

一旦到达那里,MATLAB就会看到函数,并且可以使用它们。这是我自己在私有函数上进行测试的方法。


在这种情况下,我受到启发,但最终被挫败了。请查看我的编辑。 - Richie Cotton

1

私有目录的作用是拥有具有非常有限可见性的函数,即仅限于代码中的函数。 因此,没有官方的方法(至少我所知道的)使它们可见。

检索代码/私有中任何内容的句柄的函数对我来说似乎是最清洁的方法。

另一种选择是将testsub放置在代码中。 这样做的优点是测试函数始终与它们要测试的代码在一起,但您可能认为这会“污染”您的代码目录。


是的,我更喜欢将测试代码与“真正”的代码分开。 - Richie Cotton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接