【问题标题】:How do I use MATLAB's unit testing framework to test the number of output arguments (nargout)?如何使用 MATLAB 的单元测试框架来测试输出参数的数量 (nargout)?
【发布时间】:2013-12-02 17:11:16
【问题描述】:

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

【问题讨论】:

    标签: matlab unit-testing


    【解决方案1】:

    您可以使用 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
    

    希望有帮助!

    【讨论】:

    • 为我工作。感谢您的快速支持!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 2014-08-25
    • 2011-10-19
    • 1970-01-01
    • 2011-02-06
    • 2020-12-27
    相关资源
    最近更新 更多