我在自定义类中有一个方法,只能返回0,1或2个输出。我用nargoutchk(0, 2)
检查了这一点。当指定了错误数量的输出参数时,我对单元测试此方法感到茫然。这不起作用:
classdef MyClassTest < matlab.unittest.TestCase
methods (Test)
function testMyMethod(testCase)
verifyError(testCase, @() [x, y, z] = myMethod(5), 'MATLAB:nargoutchk:tooManyOutputs')
end
end
methods
function varargout = myMethod(a)
nargoutchk(0, 2)
end
end
end
因为MATLAB无法在匿名函数内执行赋值。这也不起作用:
classdef MyClassTest < matlab.unittest.TestCase
methods (Test)
function testMyMethod(testCase)
try
[x, y, z] = myMethod(5);
catch ex
verifyError(testCase, @() rethrow(ex), 'MATLAB:nargoutchk:tooManyOutputs')
end
end
end
methods
function varargout = myMethod(a)
nargoutchk(0, 2)
end
end
end
因为rethrow
在匿名函数中无法识别(因为它不在catch
块的直接范围内)。
有没有相关的解决方法,或者在MATLAB中是不可能的?
答案 0 :(得分:4)
您可以使用Throws约束和verifyThat而不是verifyError轻松完成此操作。这看起来像这样:
classdef MyClassTest < matlab.unittest.TestCase
methods (Test)
function testMyMethod(testCase)
import matlab.unittest.constraints.Throws;
testCase.verifyThat(@() myMethod(5), ...
Throws('MATLAB:nargoutchk:tooManyOutputs', 'WhenNargoutIs', 3));
end
end
end
查看Throws文档了解详情。
另一种方法是将传递给verifyError的函数调用包装到嵌套或本地函数中:
classdef MyClassTest < matlab.unittest.TestCase
methods (Test)
function testMyMethod(testCase)
verifyError(testCase, @callMyMethodWithThreeOutputs, ...
'MATLAB:nargoutchk:tooManyOutputs');
end
end
end
function callMyMethodWithThreeOutputs
[~,~,~] = myMethod(5);
end
希望有所帮助!