返回

Laravel 8 单元测试中如何模拟模型?使用 Mockery 库伪造数据值

php

如何在 Laravel 8 单元测试中模拟模型

在编写 Laravel 8 单元测试时,你需要经常模拟 Eloquent 模型来伪造数据值。这对于测试使用模型数据的控制器和服务类至关重要。本文将介绍如何在 Laravel 8 中使用 Mockery 库模拟模型,设置其方法调用预期,并将其绑定到容器。

模拟模型

安装 Mockery 库

首先,使用 Composer 安装 Mockery 库:

composer require mockery/mockery

创建模拟

创建目标模型的模拟,例如 Currency 模型:

use Mockery as m;
$currencyMock = m::mock(Currency::class);

设置预期

接下来,使用 shouldReceive() 方法设置模拟模型的方法调用预期。例如,你可以设置 all() 方法返回一个预定义的数据集合:

$currencyMock->shouldReceive('all')->andReturn(Collection::make([
    'USD' => ['current_rate' => 1.0, 'previous_rate' => 1.0],
    'EUR' => ['current_rate' => 0.8, 'previous_rate' => 0.9],
]));

绑定模拟

将模拟模型绑定到容器,以便 Laravel 可以在运行测试时使用它:

$this->app->instance(Currency::class, $currencyMock);

运行测试

最后,运行单元测试并验证是否使用了模拟模型的数据值:

$currencyService = new CurrencyConversionService();
$results = $currencyService->currencyRates([
    'base_currency' => 'USD',
    'iso_codes' => ['EUR']
]);
dd($results); // 预期输出为 [ 'EUR' => ['current_rate' => 0.8, 'previous_rate' => 0.9] ]

总结

模拟模型是 Laravel 单元测试中伪造数据值和测试代码依赖关系的强大技术。通过使用 Mockery 库,你可以轻松设置方法调用预期,并覆盖模型方法的实际执行。这使你能够在隔离环境中测试你的代码,确保其按预期工作。

常见问题解答

  1. 为什么需要模拟模型?
    模拟模型允许你隔离代码的特定部分并测试其逻辑,而无需实际查询数据库。

  2. 我可以在哪些情况下使用模型模拟?
    你可以使用模型模拟来测试使用模型数据的控制器、服务类和其他代码。

  3. 如何模拟模型的关联关系?
    Mockery 提供了 shouldReceiveRelation() 方法来模拟模型的关联关系。

  4. 如何验证模拟方法是否被调用?
    你可以使用 shouldHaveReceived() 方法来验证模拟方法是否被调用。

  5. 如何在单元测试中断言模型的方法调用?
    你可以使用 PHPUnit 断言方法,例如 assertTrue()assertEquals(), 来断言模型的方法调用。