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.