ios - 有没有办法使用 XCTest 对 Touch Id 进行单元测试?

标签 ios unit-testing ios-simulator xctest touch-id

有没有办法使用 XCTest 对 TouchId 的“evaluatePolicy”或“canevaluatePolicy”进行单元测试?我想使用模拟器作为基础进行单元测试。

谢谢

最佳答案

我已经描述了一种为 Touch ID 代码编写单元测试的方法 in this post .

基本上,如果你有一些类似于这个的 Touch ID 管理类:

final public class TouchIDManager {

    /// Authentication context object we use for Touch ID. Typically it's just a `LAContext` instance that is mocked when testing.
    internal var authenticationContext = LAContext()

    /**
     Checks Touch ID availability.

     - returns: Flag indicating if Touch ID is available
     */
    public func touchIDAvailable() -> Bool {
        return authenticationContext.canEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, error: nil)
    }

    /**
     Authenticates the user with Touch ID

     - parameter completion: Completion handler
         */
    public func authenticate(completion: (success: Bool) -> ()) {
        guard touchIDAvailable() else {
            completion(false)
            return
        }
        authenticationContext.evaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, localizedReason: "Wanna Touch my ID?") {
            (success: Bool, error: NSError?) -> Void in
            completion(success: success)
        }
    }
}

您可以简单地伪造 LAContext StubLAContext 的行为类(class):
func testSuccessfulAuthentication() {
    /// A class faking Touch ID availability and successful user verification
    class StubLAContext: LAContext {
        override func evaluatePolicy(policy: LAPolicy, localizedReason: String, reply: (Bool, NSError?) -> Void) { reply(true, nil) }
        override func canEvaluatePolicy(policy: LAPolicy, error: NSErrorPointer) -> Bool { return true }
    }

    let manager = TouchIDManager()
    manager.authenticationContext = StubLAContext()

    manager.authenticate { (success) in
        XCTAssertTrue(success)
    }
}

很明显,这个特定的测试并没有做太多事情,但它可能是测试应用程序中其他与 Touch ID 相关的逻辑的一个很好的起点。

关于ios - 有没有办法使用 XCTest 对 Touch Id 进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31977959/

相关文章:

ios - 我可以在一台Mac计算机上安装Xcode 7 beta和Xcode 6吗

ios - 您如何应用自动布局约束来将标签与背景图像元素对齐?

c# - 如何为没有输入和输出的方法编写单元测试?

iOS UIScrollview 不以自由形式滚动全高度

ios - Xcode 6.1 中缺少本地化

ios - iPhone模拟器时差是否保留在设备上?

iOS 蓝牙不发现设备

ios - 自定义 UILabel 类中的圆角半径

iphone - Objective-C 的单元测试和代码覆盖框架?

javascript - Jest - 调用模拟函数不计算在内