我有一个带有简单用户界面的类,想为所有公共成员函数编写单元测试。
我的一个按钮通过对话框发出警告。我使用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
我使用基于类的单元测试:
如何测试点击功能?
答案 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