如何在iOS swift中制作登录屏幕的单元测试用例

问题描述 投票:0回答:3

我在登录屏幕上遇到问题。如何制作带有登录屏幕的单元测试用例?我有带有操作按钮的用户名和密码屏幕。我需要在单击按钮时调用 API 并制作一些单元测试用例。请提供一些信息给我。

ios swift unit-testing
3个回答
2
投票

最简单的方法是构建代码,使其不会实际启动登录 API 调用。相反,它:

  • 创建请求,但在发送之前停止
  • 处理响应

然后您可以测试填写字段并点击按钮是否会创建正确的请求。之后,您可以测试各种响应,包括在端到端测试中难以创建的各种错误情况。

要点击单元测试中的按钮,请确保测试可以访问该按钮。然后打电话

sendActions(for: .touchUpInside)


示例:有很多方法可以构建它。假设我们有一个协议

protocol NetworkCalling {
    typealias CallResult = Result<(Data, URLResponse), Error>
    typealias CompletionHandler = (CallResult) -> Void

    func call(request: URLRequest, completionHandler: @escaping CompletionHandler)
}

我们的视图控制器将使用它提供的任何内容。它不在乎。它只知道如何从其属性中创建 URLRequest。它还知道如何处理结果,无论是成功还是失败。

class ViewController: UIViewController {
    var networkCall: NetworkCalling?
    
    @IBAction private func login(sender: AnyObject) {
        let request = URLRequest(url: URL(string: "http://foo.bar?baz")!)
        networkCall?.call(request: request) { [weak self] result in
            self?.handleResult(result)
        }
    }

    private func handleResult(_ result: NetworkCalling.CallResult) {
        switch result {
        case let .success(data, response):
            break
        case let .failure(error):
            break
        }
    }
}

该协议引入了边界。视图控制器看不到该边界。这不是视图控制器的事。该协议使我们有机会提供不同的实现者:

  • 能够进行真正的网络调用的东西。
  • 一个装饰器,包装另一个实现者,进行日志记录。
  • 一个测试间谍,捕获其参数以进行单元测试。
  • 重放存储的响应以进行 UI 测试的伪造品。这使得 UI 测试更快、更可靠。

1
投票

您可以通过发送不同的用户名和密码参数来编写多个测试用例。

错误的用户名和密码应该会给您错误消息,然后您可以检查是否收到错误消息而不是成功消息。

输入正确的用户名和密码应该会向您显示成功消息作为响应。

使用 XCTAssertEqual 来比较消息。

这个屏幕上可能有更好的 UITest 用例。


0
投票

虽然这个问题似乎有点宽泛,但让我提一些有用的观点:

  • 在单元测试中,我们关心场景的功能,而不是关心视觉 UI 组件(例如)。那么,您对登录测试有何看法:

我需要在点击按钮时调用 API 并制作一些单位 测试用例。

有效,它是场景中的主要功能之一。

  • 您应该专注于测试您的代码,但不是 API 本身。换句话说,您的测试用例应该以您期望某种响应(例如成功或失败)的方式实现,因此收到它时会发生什么,这意味着不要尝试测试 API 响应本身(我们是此处不进行集成测试),您应该关心代码根据响应的行为。

  • 对于以上这一点,如何应用呢?您可以采用“嘲笑”响应的方法。简而言之,您可以做的是创建包含所使用的网络管理器相同行为的模拟类,因此您可以将接收到的结果(假设)硬编码为 - 例如 - 成功或失败,从而测试接收到的“应该发生什么”嘲笑”的结果。

© www.soinside.com 2019 - 2024. All rights reserved.