Laravel集成iOS内购订阅Mock测试报错:ClientFactory无mock方法
解决Laravel集成iOS内购订阅Mock测试时的
ClientFactory::mock()未定义错误 问题场景
在Laravel中集成iOS应用内购订阅功能,编写Mock测试验证响应数据时,出现错误:
Call to undefined method Imdhemy\AppStore\ClientFactory::mock()
错误原因
Imdhemy\AppStore\ClientFactory类并未提供mock()静态方法,你可能参考了过时的文档或错误示例代码。当前版本的imdhemy/app-store包需要通过Guzzle的MockHandler来模拟HTTP响应。
解决方案
使用Guzzle的MockHandler和HandlerStack创建模拟客户端,替代不存在的ClientFactory::mock()方法。修改后的可行代码如下:
<?php namespace App\Http\Controllers; use GuzzleHttp\Handler\MockHandler; use GuzzleHttp\HandlerStack; use GuzzleHttp\Psr7\Response; use Imdhemy\AppStore\ClientFactory; use Imdhemy\Purchases\Facades\Product; use JsonException; class TestApiController extends Controller { public function ValidateReceipt(): void { // 创建预期响应体 $responseBody = [ 'environment' => 'Sandbox', 'status' => 0, 'latest_receipt_info' => [ [ 'product_id' => 'fake_product_id', 'quantity' => '1', 'transaction_id' => 'fake_transaction_id', // 其他字段按需补充 ], ], // 其他字段按需补充 ]; // 创建Mock响应实例 $mock = new MockHandler([ new Response(200, [], json_encode($responseBody, JSON_THROW_ON_ERROR)), ]); // 创建Guzzle HandlerStack $handlerStack = HandlerStack::create($mock); // 通过ClientFactory创建带Mock的客户端 $client = ClientFactory::create(['handler' => $handlerStack]); // 使用模拟客户端验证收据 $verifyResponse = Product::appStore($client)->receiptData('fake_receipt_data')->verifyReceipt(); // 后续可对$verifyResponse进行断言或业务逻辑处理 dd($verifyResponse); } }
额外提示
- 建议将测试逻辑放在Laravel的
Tests目录下的测试类中,而非业务Controller内,遵循测试代码与业务代码分离的原则。 - 确认你的
imdhemy/purchases和imdhemy/app-store包为最新稳定版,避免版本差异导致的API不一致问题。
内容的提问来源于stack exchange,提问作者John Smith
相关产品推荐
相关产品推荐

