如何测试Matlab阻止uiconfirm?

时间:2019-07-03 10:57:49

标签: matlab unit-testing dialog

我有一个带有简单用户界面的类,想为所有公共成员函数编写单元测试。

我的一个按钮通过对话框发出警告。我使用uiconfirm函数并将结果分配给变量以阻止该函数,直到用户确认对话框为止。

classdef UI
    properties
        fig    matlab.ui.Figure
        button matlab.ui.control.Button
    end

    methods
        function obj = UI()
            obj.fig = uifigure();
            obj.button = uibutton(obj.fig);
            obj.button.Text = "click me";
            obj.button.ButtonPushedFcn = @(~, ~) obj.click();
        end
    end

    methods
        function click(obj)
            [~] = uiconfirm(obj.fig, "Something failed.", "Warning", ...
                "Options", {'OK'}, "Icon", "warning");
        end
    end
end

我使用基于类的单元测试:

如何测试点击功能?

1 个答案:

答案 0 :(得分:2)

我不太确定您是否熟悉Matlab App Testing Framework。 App Testing Framework允许您以编程方式与appdesigner / uifigure应用进行交互。查看组件手势可用性矩阵,以帮助加快您的UI测试需求。话虽如此,到目前为止,应用程序测试框架尚不支持与uiconfirm之类的阻止UI Dialog直接交互。

解决阻塞问题的一种明显的蛮力方法是使用自定义版本(可能是非阻塞的)对uiconfirm函数进行测试。如果这对您来说是一个容易接受的解决方案,请继续进行。但是,随着您的应用程序的更改和扩展,模拟可能也需要变得复杂,因此难以维护。

考虑到这一点,一种更好的以编程方式测试应用程序的方法是使用mocking framework创建一个模拟对象来定义uiconfirm的行为。最好的方法是通过依赖注入。在您的情况下,该应用程序可以采用/具有一个属性,该属性可以存储上下文感知的“ UIConfirm [根据您的工作流命名]”对象。在生产环境中,默认情况下,它将调用真正的uiconfirm命令,但是“模拟”或“存根”委托人可以提供确定性的输出,以使系统更可测试(并完全避免“阻塞”对话框的问题),这肯定会增加开销可以在其他简单的应用程序中执行此操作,但是我觉得您和我们一样重视测试!

还请查看这个详细的Mocking-App Testing示例https://www.mathworks.com/help/matlab/matlab_prog/write-test-that-uses-app-testing-and-mocking-frameworks.html