【问题标题】:How can I assert a delegate is called in my unit test如何断言在我的单元测试中调用了委托
【发布时间】:2019-02-07 08:25:47
【问题描述】:

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

模拟出我的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)
    }
}

【问题讨论】:

    标签: ios swift xctest


    【解决方案1】:

    你需要做一些技巧。为您的协议创建 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
    }
    

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

    【讨论】:

    • 为了更强大,我建议增加调用计数而不是使用普通布尔值。
    【解决方案2】:

    您也必须按如下方式模拟StartPresenterDelegate

    class MockStartPresenterDelegate: StartPresenterDelegate {
       var userIsAuthenticated_wasCalled = false 
    
       func userIsAuthenticated() {
           userIsAuthenticated_wasCalled = true
       }
    }
    

    MockStartPresenterDelegate 作为代理注入并检查userIsAuthenticated_wasCalled 是否为真

    【讨论】:

      【解决方案3】:

      通过这种方式,您可以在 Swift 应用程序中确认委托的单元测试

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-19
        • 2017-09-24
        • 1970-01-01
        • 2011-03-15
        • 1970-01-01
        • 2013-08-03
        • 1970-01-01
        相关资源
        最近更新 更多