有没有办法使用 XCTest 对 Touch Id 进行单元测试?
Posted
技术标签:
【中文标题】有没有办法使用 XCTest 对 Touch Id 进行单元测试?【英文标题】:Is there a way to unit test Touch Id using XCTest? 【发布时间】:2015-08-13 01:14:51 【问题描述】:有没有办法使用 XCTest 对 TouchId 的“evaluatePolicy”或“canevaluatePolicy”进行单元测试?我想以模拟器为基础进行单元测试。
谢谢
【问题讨论】:
【参考方案1】:我已经描述了一种为 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)
您可以使用 StubLAContext
类简单地伪造 LAContext
行为:
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 相关的逻辑。
【讨论】:
我看到了你的帖子,这对我来说是一个很好的起点。我被困的地方是试图在 LAErrorCode 上编写测试。有什么建议吗? 您具体要测试什么?我想你可以让存根返回特定测试所需的任何错误。 我正在尝试解决如何为特定错误制作存根。目前哪个错误并不重要,因为它们存储在枚举中。 抱歉,我仍然不明白您要为什么创建存根:您可以覆盖LAContext
存根中的任何方法并使其返回任何错误,以防您尝试测试您的代码如何响应此特定错误。
@AlexStaravoitau 我认为 Greg 的意思是问如何将“错误:NSErrorPointer”设置为 LAError.biometryLockout 之类的东西?这也是我感兴趣的以上是关于有没有办法使用 XCTest 对 Touch Id 进行单元测试?的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法在网络浏览器中使用 Android 指纹 API 或 iOS Touch ID?