Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/245.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 单元测试存储库功能,是否有必要?_Php_Unit Testing_Laravel_Phpunit_Mockery - Fatal编程技术网

Php 单元测试存储库功能,是否有必要?

Php 单元测试存储库功能,是否有必要?,php,unit-testing,laravel,phpunit,mockery,Php,Unit Testing,Laravel,Phpunit,Mockery,我正在为我写的一个测试的有用性而挣扎。事实上,我不确定我写的测试是否正确。我有一个repository类,它的函数是$q、$count,其中'q'是一个查询字符串,count是我期望返回的结果数。函数取决于我的ORM。我希望在ORM上调用几个函数。我习惯于模拟对ORM对象的依赖。我编写了一个测试来验证我只查询了4个特定字段。以下是测试后的功能: public function where($q, $count) { if(is_null($count)) { $c

我正在为我写的一个测试的有用性而挣扎。事实上,我不确定我写的测试是否正确。我有一个repository类,它的函数是$q、$count,其中'q'是一个查询字符串,count是我期望返回的结果数。函数取决于我的ORM。我希望在ORM上调用几个函数。我习惯于模拟对ORM对象的依赖。我编写了一个测试来验证我只查询了4个特定字段。以下是测试后的功能:

public function where($q, $count)
{
    if(is_null($count))
    {
        $count = 100;
    }

    $query = '%'.$q.'%';

    $contracts = $this->contractModel
        ->where('contractNumber', 'like', $query)
        ->orwhere('customerName', 'like', $query)
        ->orWhere('customerId', 'like', $query)
        ->orwhere('contractName', 'like', $query)
        ->paginate($count, [ 'contractNumber', 'contractName', 'revision', 'customerId', 'customerName' ]);

    $this->assignContractAPIUrlToResults($contracts);

    $modifiedPagerResults = $this->queryHelper->setupAdditionalPageOptions($contracts, $count);

    return $modifiedPagerResults;
}

public function it_should_query_different_fields()
{
    $eloquentBuilder = m::mock('Illuminate\Database\Eloquent\Builder');
    $queryBuilder = m::mock('Illuminate\Database\Query\Builder');
    $paginator = m::mock('\Illuminate\Pagination\Paginator');

    $this->contractModelMock->shouldReceive('where')->once()->with('contractNumber', 'like', '%foo%')->andReturn($eloquentBuilder);
    $eloquentBuilder->shouldReceive('orWhere')->once()->with('customerName', 'like', '%foo%')->andReturn($eloquentBuilder);
    $eloquentBuilder->shouldReceive('orWhere')->once()->with('customerId', 'like', '%foo%')->andReturn($eloquentBuilder);
    $eloquentBuilder->shouldReceive('orWhere')->once()->with('contractName', 'like', '%foo%')->andReturn($queryBuilder);

    $paginationResultContainer = [
        'contractNumber',
        'contractName',
        'revision',
        'customerId',
        'customerName'
    ];

    $queryBuilder->shouldReceive('paginate')->once()->with(5, $paginationResultContainer)->andReturn($paginator);

    $paginator->shouldReceive('getItems')->once()->andReturn([]);

    $this->queryResultHelperMock->shouldReceive('setupAdditionalPageOptions')->once()->with($paginator, 5);

    $this->contractRepository->where('foo', 5);
}

我做错了吗?我已经读到单元测试不应该测试实现细节,但是我应该如何测试我特别想要查询的4个字段以及仅这4个字段?因为我的函数大多只调用依赖项上的函数,所以感觉这个函数可能不需要测试?使用PHPUnit,如果不告诉测试应该对依赖项调用什么函数以及它们应该返回什么,我就无法通过测试。

测试是否为您提供了一些价值?换句话说,测试提供的值是否超过了您编写测试所付出的努力?这听起来更像是一个集成测试,而不是单元测试。但这并不一定会使它成为一个糟糕的测试。我想我的困境在于,在测试中包含实现细节是否合适,即使它与依赖性相关。如果我正在使用的依赖项后来引入了一个新函数,该函数在1次调用中完成了所有这些操作,并且我更改了我的函数,那么即使结果相同,我的测试也会失败。如果一个单元测试只需要这个输入,我期望这个输出?是的,它可能应该。那么,在你看来,什么是更好的方法来测试我要测试的东西呢。如果我不告诉Mocky我希望在依赖项上调用某些函数,Mocky将导致测试失败,所以我不能忽略这一点。我再次查看了您的代码,我认为我支持我最初的断言。如果这个测试对你来说是有价值的,我就不去管它,继续生活。如果您的实际软件需求之一是,如果您更改了实现,那么测试不应该中断,那么您将不得不做其他事情。我怀疑现在的测试还可以。