使用 PESTPHP testing framework , 我想模拟 Laravel 的缓存助手但是当我尝试它时,我得到这样的错误:
Method Mockery_2_Illuminate_Cache_CacheManager::remember() does not exist on this mock object`
我想模拟 rememberForever()
方法,但为什么 remember()
方法会显示在错误消息中?我还尝试将 shouldReceive()
更改为另一种方法,但是 remember()
方法总是被模拟。
这是我的 Controller 代码:
public function index()
{
$groups = cache()->rememberForever('groups', fn() => Group::pluck('id', 'slug'));
return view('index', compact(
'groups'
));
}
和我的测试:
it('should return given data on index page', function () {
/** @var \Tests\TestCase $this */
$groups = Group::pluck('id', 'slug');
Cache::shouldReceive('rememberForever')->once()
->with('groups', \Closure::class)
->andReturn($groups);
actingAs()->get(route('index'))
->assertViewHasAll([
'groups' => $groups,
]);
});
这是显示的错误:
• it should return given data on index page
---
Mockery\Exception\BadMethodCallException
Method Mockery_2_Illuminate_Cache_CacheManager::remember() does not exist on this mock object
at D:\Projects\Framework\laravel\Kuhaku\Kuhaku-Web\vendor\mockery\mockery\library\Mockery\Loader\EvalLoader.php:34
30▕ if (class_exists($definition->getClassName(), false)) {
31▕ return;
32▕ }
33▕
➜ 34▕ eval("?>" . $definition->getCode());
35▕ }
36▕ }
37▕
1 D:\Projects\Framework\laravel\Kuhaku\Kuhaku-Web\vendor\mockery\mockery\library\Mockery\Loader\EvalLoader.php:34
Mockery_2_Illuminate_Cache_CacheManager::_mockery_handleMethodCall("remember")
2 D:\Projects\Framework\laravel\Kuhaku\Kuhaku-Web\database\factories\UserFactory.php:24
Mockery_2_Illuminate_Cache_CacheManager::__call("remember")
Tests: 1 failed
Time: 10.12s
当使用 partialMock 时:
• it should return given data on index page
---
ErrorException
Trying to access array offset on value of type null
at D:\Projects\Framework\laravel\Kuhaku\Kuhaku-Web\vendor\laravel\framework\src\Illuminate\Cache\CacheManager.php:327
323▕ * @return string
324▕ */
325▕ public function getDefaultDriver()
326▕ {
➜ 327▕ return $this->app['config']['cache.default'];
328▕ }
329▕
330▕ /**
331▕ * Set the default cache driver name.
1 D:\Projects\Framework\laravel\Kuhaku\Kuhaku-Web\vendor\laravel\framework\src\Illuminate\Cache\CacheManager.php:327
Illuminate\Foundation\Bootstrap\HandleExceptions::handleError("Trying to access array offset on value of type null", "D:\Projects\Framework\laravel\Kuhaku\Kuha
ku-Web\vendor\laravel\framework\src\Illuminate\Cache\CacheManager.php", [])
2 D:\Projects\Framework\laravel\Kuhaku\Kuhaku-Web\vendor\mockery\mockery\library\Mockery\Loader\EvalLoader.php:34
Illuminate\Cache\CacheManager::getDefaultDriver()
Tests: 1 failed
Time: 5.47s
最佳答案
rememberForever
方法在您使用 cache()
帮助器或 Cache 获得的
门面。相反,它在 CacheManager
实例上不存在CacheRespository
实例上,您可以使用 Mockery::spy()
来查看以确保调用正确的方法。
public function testCacheWorks(): void
{
$cacheRepository = Cache::driver();
$cacheRepositorySpy = \Mockery::spy($cacheRepository);
Cache::swap($cacheRepositorySpy);
// do stuff that writes to the cache
$cacheRepositorySpy->shouldHaveReceived("rememberForever")
->once()
->with($cache_entry_key, \Closure::class)
->andReturns($some_test_object);
}
在此处选择:https://github.com/laravel/framework/issues/10803#issuecomment-625261817
关于php - 模拟 Laravel 缓存助手,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62512681/