sofa / eloquent-testsuite
为您的 Eloquent 模型使用 PHPUnit 进行快速可靠的单元测试的帮助器
资助包维护!
jarektkaczyk
softonsofa.com
1.1.4
2020-11-29 05:46 UTC
Requires
- php: >=7.1.0
Requires (Dev)
- illuminate/database: >=5.4
- mockery/mockery: 0.9.*|^1.0
- phpunit/phpunit: >=7.0
README
帮助自己进行 Eloquent 模型的单元测试
使用方法
将 EloquentTestsuite
特性添加到您的 PHPUnit 测试中
测试关系
<?php class SomeModelTest extends \PHPUnit\Framework\TestCase { use EloquentSuite; /** @test */ public function user_belongs_to_organization() { $user = $this->createRelationMock(User::class, 'belongsTo', Organization::class); $this->assertRelation('belongsTo', $user->organization()); } /** @test */ public function user_has_many_customers() { // $relation is a Mockery mock [$user, $relation] = $this->createRelationChainMock(User::class, 'hasMany', Customer::class); $relation->shouldReceive('active')->once()->andReturnSelf(); $relation->shouldReceive('latest')->once()->andReturnSelf(); $this->assertRelation('hasMany', $user->customers()); } }
测试作用域定义
测试作用域定义提供了一个简短的断言来验证给定的作用域是否存在于模型上,并且它对模型结果执行预期的过滤。
可用的断言方法有
<?php assertScopeFilters(Model $model, string $scope, string $column, string $value) assertScopeFiltersNull(Model $model, string $scope, string $column) assertScopeFiltersNotNull(Model $model, string $scope, string $column) assertScopeFiltersIn(Model $model, string $scope, string $column, array $values) assertScopeFiltersNotIn(Model $model, string $scope, string $column, array $values)
<?php class SomeModelTest extends \PHPUnit\Framework\TestCase { use EloquentSuite; public function testScopePublished() { $article = new Article(); $this->assertScopeFilters($article, 'published', 'status', 1); } public function testScopeAvailable() { $article = new Article(); $this->assertScopeFiltersNull($article, 'available', 'deleted_at'); } public function testScopeDeleted() { $article = new Article(); $this->assertScopeFiltersNotNull($article, 'deleted', 'deleted_at'); } }
对于更高级的断言,您可以使用 EloquentSuite
来创建查询,然后在方法和参数上执行自定义断言。例如,考虑这个执行原始 WHERE 查询的作用域定义。
<?php public function scopeValidOnDate($query, $date) { return $query->whereRaw('? between valid_from and valid_to', [$date]); }
您可以使用以下语法来单元测试此定义
<?php public function testScopeValidOnDate() { $assertion = $this->stringContains('valid_from'); $params = ['2020-10-10']; $query = $this->createQueryMock('whereRaw', $assertion, $params); $ticket = new Ticket(); $ticket->scopeValidOnDate($query, '2020-10-10'); }
安装
将包添加到您的项目中
path/to/your/app$ composer require sofa/eloquent-testsuite
贡献
欢迎所有贡献,PR 必须遵循 PSR-2 标准。