Как я могу издеваться над Promise в тестовой заглушке без использования PromiseKit - PullRequest
1 голос
/ 02 февраля 2020

Мне нужно добавить библиотеку в приложение, проблема в том, что библиотека использует 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
  }
}
...