MST
星途 面试题库

面试题:Swift自动化测试的Mock实现

假设你正在开发一个iOS应用,其中有一个网络请求的类`NetworkService`,它有一个方法`func fetchData(completion: @escaping (Data?, Error?) -> Void)`。在自动化测试中,为了隔离网络依赖,如何使用Mock对象来模拟`NetworkService`的行为?请给出具体的实现步骤和示例代码,包括如何设置Mock返回的数据。
26.0万 热度难度
编程语言Swift

知识考点

AI 面试

面试题答案

一键面试
  1. 创建Mock对象
    • 首先定义一个遵守NetworkService协议(假设NetworkService是基于协议的,若不是则继承NetworkService类)的Mock类。
    • 示例代码:
class NetworkServiceMock: NetworkService {
    var mockData: Data?
    var mockError: Error?
    func fetchData(completion: @escaping (Data?, Error?) -> Void) {
        completion(mockData, mockError)
    }
}
  1. 在测试中使用Mock对象
    • 在测试类中创建NetworkServiceMock的实例,并设置mockDatamockError
    • 将Mock对象传递给需要测试的类(假设这个类依赖NetworkService)。
    • 示例测试代码:
import XCTest

class MyViewControllerTests: XCTestCase {
    func testNetworkCall() {
        let networkMock = NetworkServiceMock()
        let expectedData = "Mocked data".data(using:.utf8)
        networkMock.mockData = expectedData

        // 假设MyViewController依赖NetworkService
        let viewController = MyViewController(networkService: networkMock)

        // 触发网络请求相关操作
        viewController.fetchSomeData()

        // 断言数据是否正确接收等相关测试
        XCTAssertEqual(viewController.receivedData, expectedData)
    }
}

在上述代码中,MyViewController是依赖NetworkService的视图控制器类,fetchSomeData方法触发网络请求。通过设置NetworkServiceMockmockData,可以模拟网络请求成功返回的数据,若要模拟错误,设置mockError即可。