Как сделать модульный тест для входа в Google в функции делегирования?

#ios #swift #unit-testing #google-signin

#iOS #swift #модульное тестирование #google-вход

Вопрос:

Я пытаюсь внедрить вход в Google в свой проект. И я создал адаптер интерфейса в качестве шлюза между входом в Google и приложением.

 import GoogleSignIn
import RxSwift

class GoogleSignInAdapter: NSObject {
    struct SignInDTO {
        let idToken: String
        let fullName: String
        let email: String
    }

    private(set) lazy var signInSuccessful = signInSuccessfulRelay.asSignal()
    private let signInSuccessfulRelay = PublishRelay<SignInDTO>()

    private(set) lazy var signInFailed = signInFailedRelay.asSignal()
    private let signInFailedRelay = PublishRelay<Error>()

    init() {
        GIDSignIn.sharedInstance()?.clientID = "******"
        GIDSignIn.sharedInstance()?.delegate = self
    }
}

extension GoogleSignInAdapter: GIDSignInDelegate {
    func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!) {
        if let error = error {
            signInFailedRelay.accept(error)
        } else {
            let idToken = user.authentication.idToken
            let fullName = user.profile.name
            let email = user.profile.email
            let result = SignInDTO(idToken: idToken, fullName: fullName, email: email)
            signInSuccessfulRelay.accept(result)
        }
        
    }
    
    func sign(_ signIn: GIDSignIn!, didDisconnectWith user: GIDGoogleUser!, withError error: Error!) {
        
    }
}
 

У меня все еще возникают проблемы с издевательством и тестированием этого адаптера, чтобы я мог запускать signInSuccessfulRelay and signInFailedRelay с их соответствующими параметрами, потому что единственный способ сделать это — запустить сам делегат. Но единственный способ, которым я могу заставить его сработать, — это использовать GIDSignInButton , который является производным от UIView . Это означает, что я должен ввести часть представления (которое больше подходит для тестирования пользовательского интерфейса, а не для модульного тестирования) в модульный тест. Кто-нибудь может сказать мне, как сделать тесты для этого класса?