使用StoreKitTest模拟失败交易时代理方法未触发问题
结合你用Xcode 12 Beta 6的情况,以及你之前成功模拟过购买交易的背景,我整理了几个可能的原因和对应的排查方向:
未正确处理异步回调的等待逻辑
单元测试默认是同步执行的,而buyProduct是异步操作,如果你没有用XCTestExpectation来等待回调触发,测试会直接结束,看起来像是代理方法没被调用。你可以试试这样设置:let expectation = XCTestExpectation(description: "等待失败交易回调") // 配置测试会话 testSession.failureError = SKError.Code.unknown testSession.failTransactionsEnabled = true testSession.buyProduct(productIdentifier: productIdentifier) wait(for: [expectation], timeout: 5.0) // 在代理方法中检测到failed交易时调用 // expectation.fulfill()一定要记得在
paymentQueue(_:updatedTransactions:)方法里,当识别到状态为failed的交易时,调用expectation.fulfill(),让测试等待回调完成后再结束。StoreKitTest配置顺序的隐性要求
部分Beta版本的StoreKitTest对配置顺序敏感,你可以尝试调整设置顺序:先指定failureError,再开启failTransactionsEnabled。虽然逻辑上看似无关,但Beta版API可能存在顺序依赖的小bug:// 调整后的配置顺序 testSession.failureError = SKError.Code.unknown testSession.failTransactionsEnabled = true测试会话状态残留干扰
如果你的测试用例是连续执行的,前一次测试的交易状态可能残留下来,影响当前测试的回调触发。建议在每个测试用例的setUp()方法里重置测试会话:override func setUp() { super.setUp() testSession.reset() // 重新设置代理、失败配置等内容 }Xcode 12 Beta 6的已知Bug
作为Beta版本,StoreKitTest确实存在一些未修复的问题,比如failTransactionsEnabled设置不生效的情况。如果条件允许,你可以尝试更新到后续的Beta版本;或者临时用替代方案:手动创建一个状态为failed的交易,通过测试会话的simulateTransactions(_:)方法主动触发回调。
内容的提问来源于stack exchange,提问作者sash

