Php 单元测试存储库功能,是否有必要?
我正在为我写的一个测试的有用性而挣扎。事实上,我不确定我写的测试是否正确。我有一个repository类,它的函数是$q、$count,其中'q'是一个查询字符串,count是我期望返回的结果数。函数取决于我的ORM。我希望在ORM上调用几个函数。我习惯于模拟对ORM对象的依赖。我编写了一个测试来验证我只查询了4个特定字段。以下是测试后的功能: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
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将导致测试失败,所以我不能忽略这一点。我再次查看了您的代码,我认为我支持我最初的断言。如果这个测试对你来说是有价值的,我就不去管它,继续生活。如果您的实际软件需求之一是,如果您更改了实现,那么测试不应该中断,那么您将不得不做其他事情。我怀疑现在的测试还可以。