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

在Laravel中使用Mockery进行单元测试,主要是为了隔离外部依赖,比如数据库、队列、第三方API等,从而专注于测试当前类的行为。Mockery是一个强大的PHP模拟框架,与PHPUnit集成良好,Laravel也原生支持它。
Laravel项目通常已经内置了Mockery,如果你使用的是Laravel自带的测试工具集(如Pest或PHPUnit),无需额外安装。若需手动安装,可通过Composer:
composer require --dev mockery/mockeryLaravel的测试基类 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:
use Mockery;
use Tests\TestCase;
class OrderServiceTest extends TestCase
{
public function tearDown(): void
{
Mockery::close(); // Laravel通常自动处理
}
public function test_it_can_create_order_when_payment_succeeds()
{
// 创建模拟对象
$mockGateway = Mockery::mock('App\Services\PaymentGateway');
// 定义期望行为
$mockGateway->shouldReceive('charge')
->with(100)
->andReturn(true);
// 注入模拟对象
$service = new OrderService($mockGateway);
// 执行测试
$result = $service->createOrder(100);
// 断言结果
$this->assertEquals('success', $result['status']);
}
}
如果服务是通过Laravel服务容器自动注入的(例如在控制器中),可以使用 $this->instance() 方法将模拟对象绑定到容器:
public function test_controller_action_with_mocked_service()
{
$mockGateway = Mockery::mock('App\Services\PaymentGateway');
$mockGateway->shouldReceive('charge')->with(50)->andReturn(true);
// 将模拟对象注入容器
$this->instance('App\Services\PaymentGateway', $mockGateway);
// 调用路由或控制器
$response = $this->post('/orders', ['amount' => 50]);
$response->assertStatus(200);
$response->assertJson(['status' => 'success']);
}
或者使用 app()->instance() 实现相同效果。
例如:
$mock = Mockery::mock('SomeClass');
$mock->shouldReceive('process')
->with('data')
->andReturnUsing(function ($arg) {
return strtoupper($arg);
});
基本上就这些。只要理解“伪造对象 → 设定期望 → 注入使用 → 断言行为”的流程,就能高效地为复杂依赖写测试。Laravel + Mockery组合让单元测试更轻量可控。
以上就是Laravel如何使用Mockery伪造对象进行单元测试的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号