php - 模拟 Laravel 缓存助手

标签 php laravel phpunit mockery

使用 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/

相关文章:

php - 与 `if` `else` 和 `while` 混淆

php - 将当前日期存储在数据库中

php - 一个 SQL 中的多个变量就像

PHPUnit 说路由未定义(Laravel)

phpunit - 如何从phpunit覆盖率报告中排除目录

php - 从数据库中提取组

php - Laravel 调用未定义方法 App\Seo::mapInto()

mysql - 将 MySQL 查询转换为 Laravel

laravel - Laravel 模型关系如何在核心中工作?

php - 如何在 Ubuntu 17.04 中安装 php7.0-mbstring?