【发布时间】:2019-03-20 09:17:46
【问题描述】:
我正在使用 Xcode 在具有 com.apple.security.files.user-selected.read-write 权利(即,可以访问用户通过 NSOpenPanel GUI 明确选择的文件和文件夹)的沙盒 macOS 应用上进行 UI 测试。
我注意到,在打开的面板以模态方式呈现后,代码覆盖率立即停止。这是我的代码:
@IBAction func go(_ sender: Any) {
let panel = NSOpenPanel()
panel.canCreateDirectories = true
panel.canChooseDirectories = true
panel.canChooseFiles = false
panel.allowsMultipleSelection = false
let response = panel.runModal()
switch response {
case NSApplication.ModalResponse.OK:
openPanelDidSelectURL(panel.urls[0])
default:
return
}
}
(我已经记录了我的 UI 测试,以便立即接受 NSOpenPanel,选择打开它的文件夹。)
代码覆盖率最终会像这样突出显示:
我已尝试用fatalError() 调用替换switch 语句,但UI 测试仍然成功完成,这表明紧随其后的是:
let response = panel.runModal()
...在测试期间不执行。
禁用沙盒似乎没有任何效果,所以我怀疑它以模态方式运行打开的面板会导致麻烦......
【问题讨论】:
-
view.window?.close()是否释放self? -
@Willeke 不应该; AppDelegate 将窗口控制器存储在非弱属性中;窗口控制器应该一直存在,直到将新实例分配给属性...?此外,在不运行测试时(即调试时),应用程序按预期工作。
-
@Willeke 在任何情况下,删除整个 switch 子句(包括
window.close())并用对fatalError()的调用替换它什么都不做(即,测试完成时没有受到伤害)。与关闭窗口无关... -
如果在主线程上调用代码,你能检查一下吗?模型对话框需要这个并且通常不会自己强制执行。从 Xcode 启动时(另请参阅stackoverflow.com/questions/48787777/…)以及应用程序未正确签名时(请参阅stackoverflow.com/questions/24692540/…),我也遇到了 NSOpenPanel 的问题。
-
@mahaltertin 我的应用程序已经过签名和沙盒化,但我会尽快检查线程。
标签: macos xcode-ui-testing nsopenpanel