sofa/eloquent-testsuite

为您的 Eloquent 模型使用 PHPUnit 进行快速可靠的单元测试的帮助器

1.1.4 2020-11-29 05:46 UTC

This package is auto-updated.

Last update: 2024-08-29 04:20:12 UTC


README

帮助自己进行 Eloquent 模型的单元测试

Downloads stable

使用方法

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 标准