我在登录屏幕上遇到问题。如何制作带有登录屏幕的单元测试用例?我有带有操作按钮的用户名和密码屏幕。我需要在单击按钮时调用 API 并制作一些单元测试用例。请提供一些信息给我。
最简单的方法是构建代码,使其不会实际启动登录 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
}
}
}
该协议引入了边界。视图控制器看不到该边界。这不是视图控制器的事。该协议使我们有机会提供不同的实现者:
您可以通过发送不同的用户名和密码参数来编写多个测试用例。
错误的用户名和密码应该会给您错误消息,然后您可以检查是否收到错误消息而不是成功消息。
输入正确的用户名和密码应该会向您显示成功消息作为响应。
使用 XCTAssertEqual 来比较消息。
这个屏幕上可能有更好的 UITest 用例。
虽然这个问题似乎有点宽泛,但让我提一些有用的观点:
我需要在点击按钮时调用 API 并制作一些单位 测试用例。
有效,它是场景中的主要功能之一。
您应该专注于测试您的代码,但不是 API 本身。换句话说,您的测试用例应该以您期望某种响应(例如成功或失败)的方式实现,因此收到它时会发生什么,这意味着不要尝试测试 API 响应本身(我们是此处不进行集成测试),您应该关心代码根据响应的行为。
对于以上这一点,如何应用呢?您可以采用“嘲笑”响应的方法。简而言之,您可以做的是创建包含所使用的网络管理器相同行为的模拟类,因此您可以将接收到的结果(假设)硬编码为 - 例如 - 成功或失败,从而测试接收到的“应该发生什么”嘲笑”的结果。