bogdanghervan/laravel-dummy-observer

模拟Eloquent模型保存并对保存的数据进行断言

1.0.0 2021-02-06 13:16 UTC

This package is auto-updated.

Last update: 2024-09-07 00:12:23 UTC


README

这是一个专门为Eloquent模型注册的模型观察者,可以拦截所有尝试保存的数据并对其执行断言。要保存的数据永远不会到达数据库。

Tests

安装

需求

  • PHP ≥ 7.3
  • PHPUnit ≥ 9.0
  • Laravel Eloquent ≥ 5.3

安装

使用Composer安装

composer require --dev bogdanghervan/laravel-dummy-observer

用法

假设我们想测试名为landed的方法,该方法在名为Flight的模型上。此方法将通过内部调用save来更新航班的状态。

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model
{
    protected $fillable = [
        'departure',
        'destination',
        'status'
    ];

    public function landed()
    {
        $this->status = 'landed';
        $this->save();
    }
}

单元测试可能看起来像这样

<?php

namespace Tests\Unit;

use Tests\TestCase;
use App\Models\Flight;
use BogdanGhervan\DummyObserver;

class FlightTest extends TestCase
{
    protected function setUp(): void
    {
        parent::setUp();

        // Prevent model from being saved
        Flight::observe(DummyObserver::class);
    }

    protected function tearDown(): void
    {
        DummyObserver::clear();
    }

    public function testLanded(): void
    {
        $flight = new Flight([
            'departure' => 'Bucharest',
            'destination' => 'New York',
        ]);
    
        $flight->landed();
    
        DummyObserver::assertSavedAttributes([
            'departure' => 'Bucharest',
            'destination' => 'New York',
            'status' => 'landed'
        ]);
    }
}

可用的断言

assertSavedAttributes($attributes)

验证预期的属性已被保存。

Flight::observe(DummyObserver::class);

$flight = Flight::create([
    'passenger' => 'John Smith'
]);

DummyObserver::assertSavedAttributes([
    'passenger' => 'John Smith'
]);

可以验证只保存了相关属性的一个子集。

Flight::observe(DummyObserver::class);

$flight = Flight::create([
    'passenger' => 'John Smith',
    'departure' => 'Bucharest',
    'destination' => 'New York',
    'status' => 'boarded'
]);

DummyObserver::assertSavedAttributes([
    'passenger' => 'John Smith',
    'status' => 'boarded'
]);

如果正在测试的代码中连续保存多个数据,我们可以进行多个断言。只需确保按相同的顺序指定它们。

Flight::observe(DummyObserver::class);

$flight = Flight::create([
    'departure' => 'Bucharest',
    'destination' => 'New York'
]);

$flight->update([
    'status' => 'boarded',
    'gate' => 'A1'
]);

DummyObserver::assertSavedAttributes([
    'destination' => 'New York'
]);
DummyObserver::assertSavedAttributes([
    'status' => 'boarded',
    'gate' => 'A1'
]);

assertSavedTimes($times = 1)

对模型保存的次数进行断言。

Flight::observe(DummyObserver::class);

$flight = Flight::create([
    'departure' => 'Bucharest',
    'destination' => 'New York'
]);

$flight->update([
    'status' => 'boarded',
    'gate' => 'A1'
]);

DummyObserver::assertSavedTimes(2);

assertNothingSaved()

对模型未保存进行断言。

Flight::observe(DummyObserver::class);

$flight = new Flight();

DummyObserver::assertNothingSaved();

clear()

请确保在每个测试后清除任何捕获的数据。一个很好的地方是在tearDown方法中这样做。

protected function tearDown(): void
{
    DummyObserver::clear();
}

限制

当与多个模型一起工作时,无法对原始保存的模型进行保存断言。有关更多详细信息,请参阅问题#1

支持

这在你尝试模拟Eloquent保存方法但没有任何效果时是否帮到了你?请考虑点击下面的按钮给我留言并买杯咖啡。

ko-fi

你发现了问题吗? 提交问题

我自己受到了@timacdonaldtimacdonald/log-fake上所做的工作的启发,我想感谢他!

贡献

欢迎拉取请求。所有贡献都应遵循PSR-2编码标准,并应附带通过测试。

许可证

此软件包可在MIT许可证下获得。