我正在开发一个基于MacOS Document的应用程序,它可以打开某个文件类型。我想做的是为这个应用程序编写一些UI测试,但我想为这些UI测试加载一些模拟数据。根据我的理解,我实际上应该使用 launchArguments 或 launchEnvironment 变量来加载这些模拟数据。
所以,在我看来,正确的做法是创建一些测试数据文件,并在应用程序启动时使用类似这样的东西打开这些文件。
let app = XCUIApplication()
app.launchArguments.append("-url")
app.launchArguments.append($PATH)
app.launch()
现在我的问题是,我应该在哪里添加代码 在启动时打开一个文件?有没有一个NSDocumentDelegate的方法是我应该覆盖的?我应该调用 openDocument(withContentsOf:display:completionHandler:)
或者直接设置 fileURL
或者完全是其他的东西?
现在,我的应用程序打开最后一个打开的文件或打开一个新的文档。我可以尝试覆盖 makeUntitledDocument(ofType typeName: String)
或 func restoreWindow(withIdentifier identifier: NSUserInterfaceItemIdentifier, state: NSCoder, completionHandler: @escaping (NSWindow?, Error?) -> Void)
但我觉得这两个选项都不对。
所以我想我有两个问题。1)什么是正确的方式来传递模拟数据,用于基于NSDocument的应用程序的UI测试。2)使用行参数在应用程序启动时打开文件的正确方法是什么。
1)正确的方法是什么,为一个基于NSDocument的应用程序的UI测试传递模拟数据?
我所做的是以下几点。
1) 打开一个新文档,我调用 makeUntitledDocument(ofType typeName: String)
. 完全没有必要覆盖它。然后你就可以用这个API的返回值来设置你想要的文档。
2) 要打开一个先前保存的文档,我调用了 indeed openDocument(withContentsOf:display:completionHandler:)
使用伪代码将是这样的,你可以传递任何带有模拟数据的URL。
func openDocument(itemData:ItemData) {
let controller = NSDocumentController.shared
controller.openDocument(withContentsOf: itemData.url, display: true)
{ (_, _, error:Error?) in
if error != nil {
handleError(.unableToOpenDocument(itemData.url))
}
}
}
再一次,没有必要覆盖在上面 openDocument(withContentsOf:display:completionHandler:)
.
2) 在应用程序启动时使用行参数打开文件的正确方法是什么?
我会使用一个bash脚本。
open -a $APP_PATH $DOCUMENT_PATH
这将模仿Finder的做法 但如果你不喜欢这个选项 那么你可以试试他们在这个问题的答案中提出的建议。此处.