使用Mockery可在Laravel中模拟依赖对象,如PaymentGateway,通过伪造、设定期望行为、注入和断言来测试OrderService逻辑,避免真实调用外部服务。利用shouldReceive、with、andReturn等方法定义模拟行为,并通过$this->instance()将模拟对象绑定到容器,实现对控制器的测试,确保代码单元独立且可预测。

在Laravel中使用Mockery进行单元测试,主要是为了隔离外部依赖,比如数据库、队列、第三方API等,从而专注于测试当前类的行为。Mockery是一个强大的PHP模拟框架,与PHPUnit集成良好,Laravel也原生支持它。
安装与启用Mockery
Laravel项目通常已经内置了Mockery,如果你使用的是Laravel自带的测试工具集(如Pest或PHPUnit),无需额外安装。若需手动安装,可通过Composer:
composer require –dev mockery/mockery
Laravel的测试基类 TestCase 已经集成了Mockery,每次测试结束后会自动清理模拟对象。
基本用法:伪造一个服务类
假设你有一个订单服务 OrderService,它依赖于一个支付网关 PaymentGateway。你想测试下单逻辑而不真正调用支付接口。
定义服务类示例:
class PaymentGateway{ public function charge($amount) { // 实际调用第三方API }}class OrderService{ protected $gateway; public function __construct(PaymentGateway $gateway) { $this->gateway = $gateway; } public function createOrder($amount) { $result = $this->gateway->charge($amount); return $result ? ['status' => 'success'] : ['status' => 'failed']; }}
编写测试,使用Mockery伪造PaymentGateway:
Logome
AI驱动的Logo生成工具
183 查看详情
use Mockery;use TestsTestCase;class OrderServiceTest extends TestCase{ public function tearDown(): void { Mockery::close(); // Laravel通常自动处理 } public function test_it_can_create_order_when_payment_succeeds() { // 创建模拟对象 $mockGateway = Mockery::mock('AppServicesPaymentGateway'); // 定义期望行为 $mockGateway->shouldReceive('charge') ->with(100) ->andReturn(true); // 注入模拟对象 $service = new OrderService($mockGateway); // 执行测试 $result = $service->createOrder(100); // 断言结果 $this->assertEquals('success', $result['status']); }}
在Laravel容器中绑定模拟对象
如果服务是通过Laravel服务容器自动注入的(例如在控制器中),可以使用 $this->instance() 方法将模拟对象绑定到容器:
public function test_controller_action_with_mocked_service(){ $mockGateway = Mockery::mock('AppServicesPaymentGateway'); $mockGateway->shouldReceive('charge')->with(50)->andReturn(true); // 将模拟对象注入容器 $this->instance('AppServicesPaymentGateway', $mockGateway); // 调用路由或控制器 $response = $this->post('/orders', ['amount' => 50]); $response->assertStatus(200); $response->assertJson(['status' => 'success']);}
或者使用 app()->instance() 实现相同效果。
常用Mockery方法
shouldReceive(‘method’):声明某个方法将被调用 with($arg):断言传入参数 andReturn($value):指定返回值 andReturnNull():返回null andReturnUsing(Closure):动态返回值 times(n):断言调用次数 once()、twice():简化调用次数断言 andReturnSelf():链式调用支持
例如:
$mock = Mockery::mock('SomeClass');$mock->shouldReceive('process') ->with('data') ->andReturnUsing(function ($arg) { return strtoupper($arg); });
基本上就这些。只要理解“伪造对象 → 设定期望 → 注入使用 → 断言行为”的流程,就能高效地为复杂依赖写测试。Laravel + Mockery组合让单元测试更轻量可控。
以上就是Laravel如何使用Mockery伪造对象进行单元测试的详细内容,更多请关注php中文网其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/830071.html
微信扫一扫
支付宝扫一扫