Мне нужно добавить библиотеку в приложение, проблема в том, что библиотека использует PromiseKit
. Мое приложение не использует обещания, поэтому я планировал представить адаптер для сопоставления результатов обещания с обработчиками завершения.
В чем я не уверен, так это то, что при модульном тестировании мне потребуется создать шпион , но это означает возможность или, по крайней мере, заглушение поведения обещания, возвращающего что-либо.
Я рассматривал добавление PromiseKit в качестве зависимости только к моей цели теста, но не уверен, что это лучший подход поскольку меня на самом деле не волнуют настоящие обещания.
Примером может быть: -
protocol OAuthAdapterType: SessionStateProviderType { }
final class OAuthAdapter: OAuthAdapterType {
private weak var oauthProvider: OAuthProviderType?
init(oauthProvider: OAuthProviderType?) {
self.oauthProvider = oauthProvider
}
}
extension OAuthAdapter: SessionStateProviderType {
func getStatus(then completion: @escaping (Result<SessionState, Error>) -> Void) {
oauthProvider?.checkSession()
.done { completion(.success(SessionStateMapper.map($0))) }
.catch { _ in completion(.success(.signedOut)) }
}
}
final class SessionStateMapper {
static func map(_ status: Bool) -> SessionState {
return status ? .signedIn : .signedOut
}
}
В этом случае checkSession
- это Promise<Bool>
.
Я создал бы шпиона, который будет выглядеть примерно так: -
import XCTest
import PromiseKit
import OAuthKit
class OAuthProviderSpy: OAuthProviderType {
var invokedCheckSession = false
var invokedCheckSessionCount = 0
var stubbedCheckSessionResult: Promise<Bool> = .value(false)
func checkSession() -> Promise<Bool> {
invokedCheckSession = true
invokedCheckSessionCount += 1
return stubbedCheckSessionResult
}
}