如何在OktaAuthSDK上模拟类方法进行测试?

时间:2019-07-15 08:14:58

标签: swift singleton xctest okta

我正在编写环绕OktaAuthSDK的iOS服务。

我想编写测试以确保当我调用服务时,我的方法在SDK上调用正确的类方法。

由于SDK本质上​​是单例,因此我的常规方法如下:

  1. 创建一个在我想要的单例上具有方法的协议
  2. 通过扩展名使第三方单身人士符合我的协议
  3. 使用我的协议作为类/结构上的类型
  4. 在测试时注入符合相同协议的模拟服务

在大多数情况下,这对我来说效果很好,但是OktaAuthSDK很难模拟。

他们的SDK示例:

public class OktaAuthSdk {

    public class func authenticate(with url: URL,
                                   username: String,
                                   password: String?,
                                   onStatusChange: @escaping (_ newStatus: OktaAuthStatus) -> Void,
                                   onError: @escaping (_ error: OktaError) -> Void) {

        let unauthenticatedStatus = OktaAuthStatusUnauthenticated(oktaDomain: url)
        unauthenticatedStatus.authenticate(username: username,
                                           password: password ?? "",
                                           onStatusChange:onStatusChange,
                                           onError:onError)
    }
.......

我的协议可以简化测试:

import OktaAuthSdk

protocol OktaAuthSdkType: class {
    static func authenticate(with url: URL, username: String, password: String?, onStatusChange: @escaping (_ newStatus: OktaAuthStatus) -> Void, onError: @escaping (_ error: OktaError) -> Void)
    static func recoverPassword(with url: URL, username: String, factorType: OktaRecoveryFactors, onStatusChange: @escaping (_ newStatus: OktaAuthStatus) -> Void, onError: @escaping (_ error: OktaError) -> Void)
}

extension OktaAuthSdk: OktaAuthSdkType { }

如您所见,这仅是现有方法的镜像,这使我以后可以将SDK存根。

我的初始服务:

import Foundation
import OktaAuthSdk

public class OAuthService: OAuthServiceType {

    var oktaAuthSDK: OktaAuthSdkType = OktaAuthSdk.self

}

这会产生错误

  

“ OktaAuthSdk.Type”类型的值不符合指定的类型   'OktaAuthSdkType'

如果我删除.self,则会遇到相同的错误。

由于初始化程序也是私有的,因此我也无法创建SDK的实例。

0 个答案:

没有答案