测试时默认 undoManager 为 nil

Default undoManager is nil when testing

我正在努力将一些测试添加到使用 undoManager 的 Swift 库中。在库的演示中,将以下打印添加到 viewDidAppear: 会导致打印 NSUndoManagerObject

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    print(undoManager)
}

我为测试写了另一个 ViewController,当我在 ViewController 的 viewDidAppear: 中有相同的代码时,打印 nil

我正在使用以下代码为测试创建 ViewController:

override func setUp() {
    super.setUp()

    // Put setup code here. This method is called before the invocation of each test method in the class.
    let storyboard = UIStoryboard(name: "Main", bundle: NSBundle(forClass: self.dynamicType))

    viewController = storyboard.instantiateInitialViewController() as! ViewController
    viewController.viewDidLoad()
    viewController.viewDidAppear(false)

    // Test and Load the View at the Same Time!
    XCTAssertNotNil(viewController.view)
}

我在 ViewController 的 viewDidLoad: 中调用 becomeFirstResponder()

我想测试使用默认 undoManager 的逻辑,所以我需要弄清楚为什么它是 nil。我试过为默认值 undoManager 分配 NSUndoManager 的新实例,但它是只读的 属性.

如果您有兴趣查看代码,请点击此处 Github repository

我无法使用默认的 undoManager 来测试这个项目,但我最终使用了以下我认为同样有效的解决方案。在使用 undoManager 的 class 中,我添加了一个私有 NSUndoManager 变量,然后在 init 中定义它,如下所示:

classUndoManager = undoManager
if classUndoManager == nil {
    classUndoManager = NSUndoManager()
}

任何使用 undoManager 的地方现在都使用 classUndoManager