【发布时间】:2019-09-07 13:48:51
【问题描述】:
我是 Laravel 的 Cache::remember 功能的忠实粉丝,我在我的服务类中使用它,如下所示:
/**
* SummaryService
*/
public function getSummaryData(string $userId)
{
$summaryCacheKey = $userId . '_summary_cache';
$summaryCacheLifespanMinutes = config('summary_cache_lifespan_minutes');
return Cache::remember($summaryCacheKey, $summaryCacheLifespanMinutes, function () use ($userId) {
$summaryResult = [
'userExists' => false,
'data' => [],
];
$user = $this->userRepository->findById($userId);
if ($user) {
$summaryResult = [
'userExists' => true,
'data' => $this->summaryRepository->getSummaryByUserId($user->id),
];
}
return $summaryResult;
});
}
这按预期工作。如果缓存中存在数据,则返回;如果不存在,则加载并缓存并返回。
现在,我正在尝试对我的SummaryService(两个执行路径)进行单元测试。
通过缓存返回数据的第一部分很容易测试,如下所示:
public function i_can_load_summary_data_via_cache()
{
// given
$userId = 'aaaa45-bbbb-cccc-ddddssswwwdw';
$expectedResult = [
'userExists' => true,
'data' => [ ... ],
];
$summaryCacheKey = $userId . '_summary_cache';
$summaryCacheLifespanMinutes = config('summary_cache_lifespan_minutes');
Cache::shouldReceive('remember')
->once()
->with($summaryCacheKey, $summaryCacheLifespanMinutes, Closure::class)
->andReturn($expectedResult);
// when
$result = $this->summaryService->getSummaryData($userId);
// then
$this->assertSame($expectedResult, $result);
}
但是,当我尝试测试数据不存在于缓存中的场景时,我必须像这样(通过模拟存储库)加载它:
public function i_can_load_summary_data_via_database()
{
// given
$userId = 'aaaa45-bbbb-cccc-ddddssswwwdw';
$expectedResult = [
'userExists' => true,
'data' => [ ... ],
];
$user = new User();
$user->id = $userId;
$summaryCacheKey = $userId . '_summary_cache';
$summaryCacheLifespanMinutes = 0;
Cache::shouldReceive('remember')
->once()
->with($summaryCacheKey, $summaryCacheLifespanMinutes, \Mockery::on(function() use($user) {
$this->mockedUserRepository
->shouldReceive('findById')
->once()
->andReturn($user);
$this->mockedSummaryRepository
->shouldReceive('getSummaryByUserId')
->once()
->with($user->id)
->andReturn([ ... ]);
}))
->andReturn($expectedResult);
// when
$result = $this->summaryService->getSummaryData($userId);
// then
$this->assertSame($expectedResult, $result);
}
测试失败:
找不到匹配的处理程序 Mockery_3_Illuminate_Cache_CacheManager::remember('aaaa45-bbbb-cccc-ddddssswwwdw_summary_cache', '10', object(Closure))。该方法是意外的或其 参数与此方法的预期参数列表不匹配
对象:(数组('闭包'=>数组( '类' => '关闭', '属性' => 大批 ( ), ), ))
知道如何正确测试吗?
【问题讨论】:
标签: php laravel unit-testing phpunit mockery