如何使用MATLAB的单元测试框架来测试输出参数的数量(nargout)?

时间:2013-12-02 17:11:17

标签: matlab unit-testing

我在自定义类中有一个方法,只能返回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中是不可能的?

1 个答案:

答案 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

希望有所帮助!