首页 > 解决方案 > 如何检查在我的单元测试中是否释放了无主引用?

问题描述

我的视图模型是这样的:

public class MainTabBarViewModel: MainTabBarInputs {
    unowned var output: MainTabBarOutputs
    ...
}

视图控制器是这样的:

class ViewController: MainTabBarOutputs {
    var viewModel: MainTabBarInputs!
}

我正在尝试编写一个单元测试来测试保留周期:

class MainTabBarViewModelTests: XCTestCase {

    var viewModel: MainTabBarViewModel!
    var viewController: MockMainTabBarViewController!

    func testRetainViewController() {
        viewController = nil
        // TODO how do you test this
        expect(self.viewModel.output).to(beNil())
        // crashes because I can't 
        // reference an unowned pointer that's deallocated.
    }

我知道如果我将引用更改为weak我可以测试它,但如果我想保留它unowned怎么办?

标签: swiftunit-testingmemory-management

解决方案


您可以在单元测试中使用对控制器的弱引用,如果该引用变为 nil,则您没有保留周期:

func testRetainViewController() {
    weak var testRef = viewController
    viewController = nil
    expect(testRef).to(beNil())
}

unowned您可以通过更改 from来轻松验证上述方法,strong然后查看测试是否失败。


推荐阅读