一种方法是在运行单元测试时使用单独的NSApplicationMain,而在“正常”运行时使用单独的NSApplicationMain。
首先从您当前的AppDelegate 类中删除@NSApplicationMain 注释。它最终应该看起来像这样:
AppDelegate.swift
import AppKit
class AppDelegate: NSObject, NSApplicationDelegate {
func applicationDidFinishLaunching(_ aNotification: Notification) {
print("Debug/Production run")
// Insert code here to initialize your application
}
func applicationWillTerminate(_ aNotification: Notification) {
// Insert code here to tear down your application
}
}
现在创建一个名为 AppDelegateUnitTesting.swift 的新文件,其源代码应如下所示:
AppDelegateUnitTesting.swift
import Foundation
import Cocoa
class AppDelegateTesting: NSObject, NSApplicationDelegate {
func applicationDidFinishLaunching(_ aNotification: Notification) {
print("Unit Testing Run")
// Insert code here to initialize your application
}
func applicationWillTerminate(_ aNotification: Notification) {
// Insert code here to tear down your application
}
}
现在添加一个名为main.swift 的新文件,该文件将确定我们的应用在哪个环境中运行,源代码应该是这样的:
main.swift
import Foundation
import Cocoa
let isRunningTests = NSClassFromString("XCTestCase") != nil &&
ProcessInfo.processInfo.arguments.contains("-XCUnitTests")
fileprivate var delegate: NSApplicationDelegate?
if !isRunningTests {
delegate = AppDelegate()
NSApplication.shared.delegate = delegate
// See this Answer to initialize the Windows programmatically
// https://stackoverflow.com/a/44604229/496351
} else {
delegate = AppDelegateTesting()
NSApplication.shared.delegate = delegate
}
NSApplication.shared.run()
要确定它是否在单元测试环境中运行,它会检查它是否可以加载 XCTestClass(仅在测试时注入)并检查是否存在 -XCUnitTest 命令行参数,我们必须设置这个参数我们自己作为 Scheme 的 Test 操作的一部分,如下图所示
完成所有这些操作后,您应该会在按下播放按钮时看到打印的消息 "Debug/Production run",并且在运行单元测试时应该看到打印的消息 "Unit Testing Run"。
您很可能必须添加代码以编程方式加载初始窗口,这个其他答案显示了如何做到这一点: