代码之家  ›  专栏  ›  技术社区  ›  timbre timbre

iOS应用中Cognito认证的测试

  •  3
  • timbre timbre  · 技术社区  · 7 年前

    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的各种响应 相反。

    我该怎么做?

    我认为最好的方法是嘲弄或刺伤任务队列,但我不确定如何实现这一点。任何方向都将不胜感激。如果你能以另一种方式处理类似的任务,我也想听听你的想法,谢谢。

    1 回复  |  直到 7 年前
        1
  •  3
  •   Gero    7 年前

    好吧,我不太熟悉AWS iOS SDK,也不太熟悉它是如何实现auth流的,所以请注意以下几点。我希望这不是一个完整的答案,而是一个总体的“策略”。我在当前项目中实现了类似的方法,不仅是为了登录,而且实际上是为了建立所有远程连接。

    1. 运行小型本地Web服务器 在UI测试目标中 . 我用 Embassy Ambassador 在我目前的项目中。配置它以返回Cognito(或另一个端点)通常给出的任何响应。我只是 curl AWSCognitoIdentityPasswordAuthentication 方法(成功或错误)。您可以让测试目标,也就是说,如果您知道deep链接是什么样子的(应该可以找到它?).

    2. documentation 让我相信 webDomain 是保存它的地方,但我不知道它是怎么设置的。这个属性甚至是只读的,这会使事情复杂化。不过,我假设您可以在项目中的某些配置中更改它?否则它就像一个方法刷屏的例子。。。抱歉,我不能提供更多的声音方向在这里。

    3. 在测试期间,确保将要在相关应用程序流期间访问的真正端点切换到 http://localhost/... . 我是用 XCUIApplication().launchEnvironment["somekey"] = "TESTINGKEY"

    我承认这是一个很大的工作,但对我来说这是值得的,因为我可以在没有任何网络访问的情况下轻松地运行整个应用程序流(其中涉及许多传出请求)。无论如何,我必须自己实现auth系统,这给了我对url的使用和位置的大量控制,使得根据launch环境变量可以很容易地有一个单独的位置来存根它们。在我的案例中,最丑陋的部分实际上是启用了ATS异常 只在我的测试中