假设我有一些使用两个内部帮助函数Foo
和bar
的函数baz
。
有没有办法整理代码,以便bar
和baz
保持"看不见",但同时可以进行单元测试? (最好,bar
和baz
的单元测试与主函数Foo
的单元测试位于同一套件中。)
答案 0 :(得分:3)
有几种方法可以实现这一目标。
首先,Foo
是否需要成为一个函数?如果它是一个类,那么您可以将bar
和baz
实现为Hidden
和Access='protected'
,这是非常严格锁定的。然后,您可以创建一个特定于测试的子类,以访问bar
和baz
进行测试。如果需要,您还可以scope the access进行测试以进一步将其与其他视图锁定。
如果您确实希望Foo
成为一个功能,那么您仍然可以选择。其中之一是以某种方式获取测试的私有本地函数的函数句柄。您可以通过Foo的一些特殊调用语法来执行此操作,该语法在调用时将这些函数返回到测试。但是,这会以可能令人困惑的方式修改生产代码,并且它实际上将测试逻辑插入到生产中。我宁愿隐藏这些函数,方法是将它们放入一个包中,使它们不在全局命名空间中。包的名称可以表明它们不受限制,不属于您支持的界面。
最后,一个选项是简单地使用公共接口来测试这些功能。显然,在某些情况下,它们会从函数中调用。您可能需要考虑通过界面的前门编写测试。这样做的一个好处是,您可以轻松地更改本地函数结构的实现,而无需修改测试。私有函数是私有的,因为根据定义它们是您的实现的一部分,而不是您的接口。如果你发现它足够复杂,需要独立于Foo
接口的自己的测试,那么它应该只是被分解成另一个包函数或类,如上所述,以便进行单元测试。
答案 1 :(得分:1)
不是最优雅的方式,但Matlab并不是在单个代码文件中构建模块的最实用的语言。 一种方法是使用更高级别的函数将输入参数传递给您选择的函数:
function out = fooModule( FunctionCalled , varargin)
%// This main function only transfer the input argument to the function chosen
switch FunctionCalled
case 'main'
out = foo(varargin) ;
case 'bar'
out = mBar(varargin) ;
case 'baz'
out = mBaz(varargin) ;
end
end
function outFoo = foo(varargin)
%// your main FOO code
%// which can call the helper function if necessary
end
function outbar = mBar(varargin)
%// your code
end
function outbaz = mBaz(varargin)
%// your code
end
如果您想要压缩内容,您甚至可以将FunctionCalled
参数嵌入varargin
。这也可以测试第一个参数的类型。因此,例如,如果第一个参数不是string
(调用其中一个辅助函数),则将执行直接转发到主foo函数,而不必显式调用它(因此辅助函数保持“不可见”)如果没有明确调用)。
否则,一种完全不同的方法,你可以考虑写一个类。