gpt4 book ai didi

ios - 如何测试 deinit 是否被正确调用?

转载 作者:行者123 更新时间:2023-12-01 07:09:48 25 4
gpt4 key购买 nike

这是我的单元测试:

    func testDeinit() {
let view = DocumentsView(theme: MockTheme())
let viewModel = DocumentsViewModelMock()
let delegate = DocumentsViewControllerDelegateMock()
var controller: DocumentsViewController? = DocumentsViewController(view: view, viewModel: viewModel, delegate: delegate)
controller?.viewDidLoad()
let expectation = self.expectation(description: "")
XCTAssertFalse(delegate.documentViewControllerDeinitializedWasCalled)
controller = nil
XCTAssertTrue(delegate.documentViewControllerDeinitializedWasCalled)
}

deinit 看起来像这样:

deinit {
delegate?.documentViewControllerDeinitialized()
}

和我的代表:

class DocumentsViewControllerDelegateMock: DocumentsViewControllerDelegate {
var documentViewControllerDeinitializedWasCalled = false
func documentViewControllerDeinitialized() {
documentViewControllerDeinitializedWasCalled = true
}
}

我的 DocumentsViewController 初始化。

    private weak var delegate: DocumentsViewControllerDelegate?
// MARK: - Initialization
init(view: DocumentsView, viewModel: DocumentsViewModelable, delegate: DocumentsViewControllerDelegate) {
self.mainView = view
self.viewModel = viewModel
self.delegate = delegate
super.init(nibName: nil, bundle: nil)
}

以上单元测试失败。为什么?

这种情况是因为 deinit 被调用 AFTER XCTAssertTrue 被检查。如何以异步方式进行?

最佳答案

恕我直言,这是一个糟糕的测试。

您基本上是在测试如果对象被释放,您的deinit 中的内容是否被调用。那不是你测试的东西。 Apple 的 Swift 设计师应该对此进行测试。

改为进行另外两项测试。

  1. 测试执行controller = nil 后, Controller 是否被释放。你可以只做一个XCTAssertNil。诀窍是获取对 Controller 的 weak 引用,以便您可以将其传递给断言
  2. 单独测试deinit 方法中的内容。在你的情况将是手动触发delegate?.documentViewControllerDeinitialized() +XCTAssertTrue(delegate.documentViewControllerDeinitializedWasCalled)

这样做你也可以避免模拟 DocumentsViewControllerDelegate 协议(protocol)。

关于ios - 如何测试 deinit 是否被正确调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58303581/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com