在 XCTestCase 中自动关闭对话框

Posted

技术标签:

【中文标题】在 XCTestCase 中自动关闭对话框【英文标题】:Automatically dismissing dialog in XCTestCase 【发布时间】:2020-07-22 18:47:36 【问题描述】:

当我的应用首次启动时,它会显示一个对话框,要求用户通过单击“不允许”或“确定”进行响应,如果他们允许该应用使用麦克风。

问题是,当单元测试第一次启动时,会出现同样的对话框,这会停止测试的执行。如果 Xcode Server 正在运行单元测试,则无法手动干预并单击按钮。

有没有办法自动关闭此对话框?点击哪个按钮进行单元测试无关紧要。

我尝试将以下代码放入 XCTestCase setUp() 方法中:

[self addUIInterruptionMonitorWithDescription:@"Interruption Monitor" handler:^BOOL(XCUIElement * element) 
    XCUIElement *button = [[element buttons] elementAtIndex:0];
    if (button) 
        [button tap];
    
];

但处理程序永远不会被调用。

如果有办法一开始就永远不显示对话框,我什至不需要应用程序来关心单元测试的麦克风。

【问题讨论】:

单元测试?还是 UI 测试? (看着那里的 XCUIElement……) 【参考方案1】:

在执行测试之前使用 shell 命令 xcrun simctl privacy(例如,在 xcodebuild ... 之前或作为目标设置中的准备步骤)

这里是它的信息

Grant, revoke, or reset privacy and permissions
Usage: simctl privacy <device> <action> <service> [<bundle identifier>]

    action
         The action to take:
             grant - Grant access without prompting. Requires bundle identifier.
             revoke - Revoke access, denying all use of the service. Requires bundle identifier.
             reset - Reset access, prompting on next use. Bundle identifier optional.
         Some permission changes will terminate the application if running.
    service
         The service:
             all - Apply the action to all services.
             calendar - Allow access to calendar.
             contacts-limited - Allow access to basic contact info.
             contacts - Allow access to full contact details.
             location - Allow access to location services when app is in use.
             location-always - Allow access to location services at all times.
             photos-add - Allow adding photos to the photo library.
             photos - Allow full access to the photo library.
             media-library - Allow access to the media library.
             microphone - Allow access to audio input.
             motion - Allow access to motion and fitness data.
             reminders - Allow access to reminders.
             siri - Allow use of the app with Siri.
    bundle identifier
         The bundle identifier of the target application.

Examples:
    reset all permissions: privacy <device> reset all
    grant test host photo permissions: privacy <device> grant photos com.example.app.test-host

Warning:
Normally applications must have valid Info.plist usage description keys and follow the API guidelines to request access to services. Using this command to bypass those requirements can mask bugs.

【讨论】:

【参考方案2】:

中断监视器需要返回一个布尔值——这个想法是测试运行程序将在检测到中断时执行所有已添加到中断处理程序堆栈中的中断处理程序,直到其中一个处理程序返回 true。

https://developer.apple.com/documentation/xctest/xctestcase/handling_ui_interruptions

https://developer.apple.com/videos/play/wwdc2020/10220/

【讨论】:

我从未尝试在 unit 测试中使用中断监视器(请参阅问题)。它们有用吗?

以上是关于在 XCTestCase 中自动关闭对话框的主要内容,如果未能解决你的问题,请参考以下文章

3 秒后自动关闭对话框 angular 5 observables

打印对话框关闭后自动关闭窗口

如何在 Visual Studio 中禁用基于对话框的 MFC 应用程序的自动关闭?

React-Native-Image-Picker 对话框在 IOS 中启动后自动关闭

怎么关IDM自动下载?

C#中对话框自动关闭的一种方法。