1
votes

Comment puis-je affirmer qu'un délégué est appelé dans mon test unitaire

Je voudrais préciser que la bonne méthode de délégué est appelée en fonction du résultat d'une vérification dans mon présentateur.

Après avoir simulé mon IdentityProvider pour renvoyer true, comment écrirais-je un test pour affirmer que delegate? .userIsAuthenticated () est appelé?

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)
    }
}


0 commentaires

3 Réponses :


2
votes

Vous devez également vous moquer de StartPresenterDelegate comme suit.

class MockStartPresenterDelegate: StartPresenterDelegate {
   var userIsAuthenticated_wasCalled = false 

   func userIsAuthenticated() {
       userIsAuthenticated_wasCalled = true
   }
}

Injectez MockStartPresenterDelegate en tant que délégué et vérifiez que userIsAuthenticated_wasCalled est vrai


0 commentaires

5
votes

Vous devez faire un truc. Créez MockDelegateClass pour votre protocole StartPresenterDelegate exemple:

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
}

alors dans votre test essayez de faire quelque chose comme ça:

class MockDelegate: StartPresenterDelegate {

    var isUserIsAuthenticatedCalled = false
    var isUserNeedsToAuthenticateCalled = false

    func userIsAuthenticated() {
        isUserIsAuthenticatedCalled = true
    }

    func userNeedsToAuthenticate() {
        isUserNeedsToAuthenticateCalled = true
    }
}

Pour différents états, vous avez besoin de tests différents, pour vous il sera le moyen le plus simple de tester l'appel des délégués.


1 commentaires

Pour rendre cela encore plus fort, je recommande d'incrémenter un nombre d'appels au lieu d'utiliser des booléens simples.



0
votes

 entrez la description de l'image ici

De cette façon, vous pouvez confirmer le test unitaire pour les délégués dans les applications Swift


0 commentaires