繁体   English   中英

我如何断言在单元测试中调用了委托

[英]How can I assert a delegate is called in my unit test

我想证明,根据演示者中检查的结果,可以调用正确的委托方法。

模拟了我的IdentityProvider返回true之后,如何编写测试来断言delegate?.userIsAuthenticated()将调用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)
    }
}

您还必须如下模拟StartPresenterDelegate

class MockStartPresenterDelegate: StartPresenterDelegate {
   var userIsAuthenticated_wasCalled = false 

   func userIsAuthenticated() {
       userIsAuthenticated_wasCalled = true
   }
}

注入MockStartPresenterDelegate作为委托,并检查userIsAuthenticated_wasCalled是否为true

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

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

在此处输入图片说明

这样,您可以在Swift应用程序中确认代表的单元测试

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM