Laravel 功能测试。缓存模拟不起作用! CacheManager::driver(),但没有指定期望

Posted

技术标签:

【中文标题】Laravel 功能测试。缓存模拟不起作用! CacheManager::driver(),但没有指定期望【英文标题】:Laravel Feature Testing. Cache mocking not working! CacheManager::driver(), but no expectations were specified 【发布时间】:2019-10-07 15:27:41 【问题描述】:

当我使用单元测试缓存模拟测试我的应用程序时,效果很好。但是当我尝试通过功能测试来测试我的 api 时,我遇到了一个异常。

public function testGet()

    Cache::shouldReceive('rememberForever')->times(5)->andReturn([]);

    Cache::shouldReceive('has')
        ->once()
        ->andReturn(false);

    Cache::shouldReceive('forever')
        ->once()
        ->andReturn([]);

    $response = $this->getJson('/api/table/get');
    $response->assertOk();

    $responseArr = $response->getOriginalContent();
    $this->assertEmpty($responseArr['table']);

Tests\Feature\Controller\API\Site\TableApiControllerTest::testGet 嘲弄\异常\BadMethodCallException:收到 Mockery_2_Illuminate_Cache_CacheManager::driver(),但没有期望 被指定了

在其他单元测试中完全相同的模拟工作没有错误。

【问题讨论】:

我猜你已经完成了,但我会在调用缓存之前通过 die-dumping 来检查相同的代码是否正在执行,以确保它是一个 Mocking 问题。实际的 Cache 被触动了吗? dd(123);在缓存无例外地工作之前 你是否覆盖了phpunit.xml 文件中的一些环境变量? 仅 DB_CONNECTION 【参考方案1】:

我在这里找到了答案 - https://github.com/laravel/framework/issues/10803#issuecomment-401611084%23issuecomment-401611084

    $cacheDriver = app('cache')->driver();
    Cache::shouldReceive('driver')->andReturn($cacheDriver);

【讨论】:

以上是关于Laravel 功能测试。缓存模拟不起作用! CacheManager::driver(),但没有指定期望的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel(流明)上使用 Mockery 模拟 Eloquent 模型不起作用

laravel 缓存清除有时不起作用

laravel 路由修改不起作用解决方案

尝试使用 phpunit 模拟控制器内部的 http 客户端,但它不起作用

Android 仅加载缓存不起作用。离线显示 WebView

为啥 Laravel 中的新路线不起作用?