使用MockURLSession时遇‘Cannot call value of non-function type URLSession’错误求助
解决单元测试中
Cannot call value of non-function type 'URLSession'错误 我来帮你梳理下问题所在,一步步解决这个单元测试的报错:
错误根源拆解
你遇到的Cannot call value of non-function type 'URLSession'提示,核心是这两个问题导致的:
- 传类型而非实例:调用代理方法时,你传的
MockURLSessionDataTask是类本身,不是它的实例;Error是协议类型,不是具体的错误实例或nil,这不符合方法的参数要求。 - MockSession初始化冗余且不安全:你嵌套实例化
MockURLSession()来获取响应,还做了强制类型转换,不仅代码冗余,还可能触发崩溃。
修正后的单元测试代码
假设你的MockURLSession是URLSession的子类,MockURLSessionDataTask是URLSessionDataTask的子类,我帮你调整了代码:
func test_urlSession() { // 先确保urlRequest已正确初始化,避免强制解包的风险 guard let targetRequest = urlRequest else { XCTFail("urlRequest未完成初始化") return } // 正确初始化MockSession:直接用类方法获取响应,无需嵌套实例化 let mockResponse = MockURLSession.successHttpURLResponse(request: targetRequest) let mockSession = MockURLSession(mockResponse: mockResponse) // 创建MockTask的实例(而不是传类类型) let mockTask = MockURLSessionDataTask() // 场景1:模拟请求成功,错误参数传nil sut?.urlSession(mockSession, task: mockTask, didCompleteWithError: nil) // 这里可以添加断言,验证sut在成功场景下的预期行为 // XCTAssertEqual(sut?.someProperty, expectedValue) // 场景2:模拟请求失败,传递具体的错误实例 let testError = URLError(.cannotConnectToHost) sut?.urlSession(mockSession, task: mockTask, didCompleteWithError: testError) // 添加失败场景的断言逻辑 // XCTAssertEqual(sut?.errorMessage, testError.localizedDescription) }
额外优化建议
- 拆分测试用例:把成功和失败场景拆成两个独立的测试方法(比如
test_urlSession_didCompleteWithSuccess和test_urlSession_didCompleteWithError),让测试逻辑更清晰。 - Mock类校验:确认你的
MockURLSession和MockURLSessionDataTask正确继承了对应的系统类,这样才能匹配代理方法的参数类型。 - 减少强制解包:用
guard let或if let处理可选值,让测试代码更健壮,避免意外崩溃。
内容的提问来源于stack exchange,提问作者SwiftyJD
相关产品推荐
相关产品推荐

