0

我正在尝试测试我的协调器流程,但是deinit在单元测试用例完成之前调用 了子协调器

我的协调员班

public final class AppCoordinator: Coordinator {

        public var childCoordinators: [Coordinator] = []

        public var navigationController: UINavigationController
        var window: UIWindow?

        public init(window: UIWindow?) {
            self.window = window
            let secController =  SecController()
            self.navigationController = UINavigationController(rootViewController: secController)
            secController.delegate = self

        }
        public func start() {
            window?.rootViewController = navigationController
            window?.makeKeyAndVisible()
        }
    }

    extension AppCoordinator: SecControllerDelegate, SignInControllerDelegate {
        public func removeSingIn() {

            self.childCoordinators.removeFirst()
        }

        public func showSignIn() {
            let signInCoordinator = SignInCoordinator(navigationController: self.navigationController)
            signInCoordinator.delegate = self
            self.childCoordinators.append(signInCoordinator)
            signInCoordinator.start()

        }

}

单元测试类

class AppCoordinatorTests: XCTestCase {
    var coordinator: AppCoordinator!

    override func setUp() {
        super.setUp()
        coordinator = AppCoordinator(window: UIWindow())
    }

    override func tearDown() {
        coordinator = nil
        super.tearDown()
    }

    func testStartMethod() {
        coordinator.start()
        XCTAssertNotNil(coordinator.window?.rootViewController)
    }

    func testShowSignIn() {
        coordinator.showSignIn()
        XCTAssertFalse(coordinator.childCoordinators.isEmpty)
        XCTAssertTrue(coordinator.navigationController.visibleViewController is SignInController)
        }
}

testShowSignIn由于deinit调用removeSingIn功能,尝试测试总是失败

public class SignInController: UIViewController {

    public weak var delegate: SignInControllerDelegate?

    public init() {

        super.init(nibName: nil, bundle: nil)
    }

    deinit {
        self.delegate?.removeSingIn()
    }

}
4

1 回答 1

0

让我们回顾一下步骤:

  • testShowSignIn来电coordinator.showSignIn(),哪里coordinatorAppCoordinator
  • showSignIn()实例化 a SignInCoordinator,并将其委托设置为AppCoordinator实例。

现在我们到了重要的部分:

  • 我们到达终点showSignIn()SignInCoordinator超出范围,因此 Swift 将其销毁。

没有任何东西维护对SignInCoordinator. 但是你想测试 和 之间的AppCoordinator交互SignInCoordinator。代码正在与您作斗争,因为它AppCoordinator决定SignInCoordinator自行创建和销毁。

您可以通过更改设计来测试它。你有几个选择。

选项 1:更改AppCoordinator为具有返回SignInCoordinator. 如果你对那个设计没问题,这可以工作。然后SignInCoordinator将继续存活,以便测试可以查询它。这AppCoordinator通过暴露SignInCoordinator.

选项 2:让测试创建 aSignInCoordinator并将作为参数传递给showSignIn(). 然后SignInCoordinator生命周期将完全在AppCoordinator.

于 2020-04-29T04:46:49.450 回答