gpt4 book ai didi

ios - 在 iOS 应用程序中测试 Cognito 身份验证

转载 作者:搜寻专家 更新时间:2023-10-31 22:24:37 26 4
gpt4 key购买 nike

我有一个带有 Cognito 身份验证的 iOS 应用程序,与 CognitoYourUserPoolsSample 非常相似.最重要的片段在 SignInViewController.swift 中:

  1. 当用户点击登录时,添加异步任务:

    var passwordAuthenticationCompletion: AWSTaskCompletionSource<AWSCognitoIdentityPasswordAuthenticationDetails>?
    ...
    @IBAction func signInPressed<...> {
    ...
    let authDetails = AWSCognitoIdentityPasswordAuthenticationDetails(username: self.username.text!, password: self.password.text! )
    self.passwordAuthenticationCompletion?.set(result: authDetails)
    ...
  2. 稍后我们会得到成功或错误响应:

    extension SignInViewController: AWSCognitoIdentityPasswordAuthentication {
    public func getDetails<...> {
    DispatchQueue.main.async {
    // do something in case of success
    ...

    public func didCompleteStepWithError<...> {
    DispatchQueue.main.async {
    // do something in case of failure
    ...

我还有一个 UI 测试,填写用户名和密码,点击登录并验证响应:

class MyAppUITests: XCTestCase {
...
func loginTest() {
let usernameField = <...>
usernameField.tap()
usernameField.typeText("user@domain.com")
...
// same for password field
// then click Sign In
<...>.buttons["Sign In"].tap()

目前,此测试是针对 实际 AWS 基础设施进行的,由于多种原因,该基础设施并不理想。我想要的是模拟来自 AWS 的各种响应

我该怎么做?

我认为最好的方法是模拟或刺穿任务队列,但我不确定如何处理。任何方向将不胜感激。如果您以其他方式处理类似任务,我也想听听您的想法,谢谢。

最佳答案

好吧,我不太熟悉 AWS iOS SDK 以及它究竟是如何实现身份验证流程的,所以请对以下内容持保留态度。我希望这不是一个完整的答案,而是一个一般的“策略”。我在我当前的项目中实现了类似的方法,不仅用于登录,而且实际上我建立的所有远程连接。

你需要做三件事:

  1. 在您的 UI 测试目标中运行一个小型本地网络服务器。我用 EmbassyAmbassador为此,在我当前的项目中。将其配置为返回 Cognito(或其他端点)通常提供的任何响应。我只是简单地 curl 手动请求并将响应保存在某个地方,但在我的情况下,我收到的是纯数据(而不是,例如,一个完整的登录页面显示在 web View 中......)。我的猜测是,Cognito 实际上显示了一个登录(网络) View ,并且在成功登录时使用深层链接“返回”到您的应用程序,最终调用您的 AWSCognitoIdentityPasswordAuthentication 方法(成功或错误)。您可以拥有测试目标,即,如果您知道深度链接的外观(应该有可能发现?),网络服务器会直接调用深层链接。

  2. 添加一些机制以在测试期间切换 Cognito 端点。不幸的是,这需要添加生产代码,但如果做得好,应该不会太困难。我通过使用我在测试期间设置的启动环境变量来做到这一点(见下文)。除非您的网络服务器支持 https(Embassy 不是开箱即用的),否则这还需要以某种方式配置 App Transport Security。最困难的部分肯定是弄清楚端点在 SDK 中的哪个位置构造以及如何更改它。快速浏览 documentation让我相信 webDomain 是保存它的地方,但我看不到它是如何设置的。该属性甚至是只读的,这使事情变得复杂。不过,我假设您可以在项目的某些配置中更改它?否则它就像是方法混合的案例......抱歉我不能在这里提供更多的声音指导。

  3. 在您的测试期间,确保将在相关应用程序流程期间访问的真实端点切换到 http://localhost/...。我通过使用 XCUIApplication().launchEnvironment["somekey"] = "TESTINGKEY" 实现了这一点,这与我在第二步中准备的生产代码相匹配。在我的例子中,我可以简单地加载不同的端点(它有本地主机域和其他与原始域相同的路径)。根据测试用例(成功登录、无效凭据等)配置您的网络服务器的响应。

我承认这是很多工作,但对我来说这是值得的,因为我可以在没有任何网络访问权限的情况下轻松运行整个应用程序流程(其中涉及大量传出请求)。无论如何,我必须自己实现我们的身份验证系统,这让我可以很好地控制使用哪些 URL 以及在哪里使用,从而可以很容易地在一个地方根据启动环境变量将它们 stub 。在我的案例中,最丑陋的部分实际上是启用 ATS 异常仅在我的测试中,出于各种原因我不得不使用运行脚本。

关于ios - 在 iOS 应用程序中测试 Cognito 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52795937/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com