ios - 我如何断言在我的单元测试中调用了委托(delegate)

标签 ios swift xctest

我希望根据演示者的检查结果调用正确的委托(delegate)方法。

在模拟了我的 IdentityProvider 以返回 true 之后,我将如何编写一个测试来断言调用了 delegate?.userIsAuthenticated()

import Foundation
import InjectStory

protocol StartPresenterDelegate: class {
    func userIsAuthenticated()
    func userNeedsToAuthenticate()
}

class StartPresenter {
    weak var delegate: StartPresenterDelegate?
    weak var view: StartViewInterface!

    private lazy var identityProvider = Dependencies.identityProvider.inject()

    init(view: StartViewInterface) {
        self.view = view
    }

    private func checkUserAuthState() {
        if identityProvider.isAuthorized() {
            delegate?.userIsAuthenticated()
        } else {
            delegate?.userNeedsToAuthenticate()
        }
    }

}

extension StartPresenter: StartPresentation {
    func onViewDidLoad() {
        checkUserAuthState()
    }
}

extension StartPresenter {
    struct Dependencies {
        static let identityProvider = Injection<IdentityProviderProtocol>(IdentityProvider.shared)
    }
}

最佳答案

你需要做一些技巧。为您的协议(protocol)创建 MockDelegateClass StartPresenterDelegate 示例:

class MockDelegate: StartPresenterDelegate {

    var isUserIsAuthenticatedCalled = false
    var isUserNeedsToAuthenticateCalled = false

    func userIsAuthenticated() {
        isUserIsAuthenticatedCalled = true
    }

    func userNeedsToAuthenticate() {
        isUserNeedsToAuthenticateCalled = true
    }
}

然后在你的测试中尝试做类似的事情:

func test_MyTest() {
    // init your class StartPresenter that you wanna test
    var presenter = StartPresenter(...)
    var mockDelegate = MockDelegate()
    presenter.delegate = mockDelegate
    presenter.onViewDidLoad()

    XCTAssertTrue(mockDelegate.isUserIsAuthenticatedCalled)
    XCTAssertFalse(mockDelegate.isUserNeedsToAuthenticateCalled)
    // or change isUserIsAuthenticatedCalled and isUserNeedsToAuthenticateCalled if you expect another states
}

对于不同的状态你需要不同的测试,对你来说这将是测试委托(delegate)调用最简单的方法。

关于ios - 我如何断言在我的单元测试中调用了委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54569060/

相关文章:

Swift:在协议(protocol)扩展中初始化对象后调用一些方法

ios - XCTest 每次都没有给我准确的结果(有时失败,有时通过)

ios - 使用Swift和XCTest修改私有(private)数组的测试方法

swift - 如何使用 XCTest 测试 staticTexts 是否包含字符串

iOS旋转视频AVAsset avfoundation

ios - Facebook SDK 和 Flurry 的 iTunes Connect 'Contains Encryption'

iphone - iCarousel 在加载 View 时选择第一个索引

ios - 如何在 UICollectionViewSectionHeader 中嵌入 UICollectionView

ios - 导入自己的swift框架

ios - 如何在 Swift 中使用关联类型测试协议(protocol)的一致性?