bogdanghervan / laravel-dummy-observer
模拟Eloquent模型保存并对保存的数据进行断言
1.0.0
2021-02-06 13:16 UTC
Requires
- php: ^7.3|^8.0
- dms/phpunit-arraysubset-asserts: ^0.2.1
- illuminate/database: >=5.3
- phpunit/phpunit: ^9.5
README
这是一个专门为Eloquent模型注册的模型观察者,可以拦截所有尝试保存的数据并对其执行断言。要保存的数据永远不会到达数据库。
安装
需求
- 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保存方法但没有任何效果时是否帮到了你?请考虑点击下面的按钮给我留言并买杯咖啡。
你发现了问题吗? 提交问题
我自己受到了@timacdonald在timacdonald/log-fake上所做的工作的启发,我想感谢他!
贡献
欢迎拉取请求。所有贡献都应遵循PSR-2编码标准,并应附带通过测试。
许可证
此软件包可在MIT许可证下获得。