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) } }
3 Réponses :
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
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.
Pour rendre cela encore plus fort, je recommande d'incrémenter un nombre d'appels au lieu d'utiliser des booléens simples.