如何让Xcode Cloud识别fulfillment(of:timeout:enforceOrder:)方法?
Xcode Cloud无法识别
fulfillment(of:timeout:enforceOrder:)方法的解决方案 本地运行异步测试时,fulfillment(of:timeout:enforceOrder:)方法可正常工作,但在Xcode Cloud环境中执行测试时,报错「Cannot find 'fulfillment' in scope」。当前Xcode Cloud使用Xcode 14.3.1 (14E300c)和macOS Ventura 13.5 (22G74),将代码替换为wait(for: [expectation], timeout: 0.1)可运行,但会收到「Instance method 'wait' is unavailable from asynchronous contexts; Use await fulfillment(of:timeout:enforceOrder:) instead; this is an error in Swift 6」的警告,并非最优解。
触发问题的异步测试代码:
func testThatFooThrows() async throws { // GIVEN let expectation = expectation(description: "Expect to throw error") let fooMock = FooMock<Bar>() fooMock.failWithBadUrlError() let sut = FooService(contentID: "Test", myService: fooMock) // WHEN do { _ = try await sut.doSomething() } catch { expectation.fulfill() } // THEN await fulfillment(of: [expectation], timeout: 0.1) }
可能的解决办法
- 确认测试类基础设置:确保测试类正确继承自
XCTestCase,并且文件顶部导入了import XCTest框架,Xcode Cloud环境对模块导入的检查可能更严格。 - 统一Swift版本配置:检查本地项目的Swift版本(项目设置中的Swift Language Version),确保Xcode Cloud的构建配置使用完全相同的版本,版本不匹配可能导致API识别异常。
- 验证异步方法声明:确认测试方法的
async throws声明正确,fulfillment调用前的await关键字没有遗漏,Xcode Cloud的编译器对异步语法的校验可能更严格。 - 清理构建缓存:在Xcode Cloud的构建流程中添加清理缓存步骤(比如执行
xcodebuild clean),避免旧的构建产物干扰新的测试执行。 - 显式指定模块访问:尝试将
fulfillment调用改为await XCTest.fulfillment(of: [expectation], timeout: 0.1),显式指定XCTest模块,解决环境中的模块查找问题。
内容的提问来源于stack exchange,提问作者Rafał Sroka
相关产品推荐
相关产品推荐

