как проверить, что красноречивая модель не была извлечена из кеша - PullRequest
0 голосов
/ 14 февраля 2020

Я использую кэширование для запросов к базе данных в своем приложении laravel, в методе get контроллера JSON API

public function show(Request $request, BlogPost $blog)
{
    if (Carbon::parse($request->header('If-Modified-Since'))->lessThan($blog->updated_at)) {

        Log::debug('Fetch from cache or database and save in cache');
        $slug = $blog->slug;
        $blogPost = Cache::remember($slug, 60 * 24 * 7, function () use ($blog, $slug) {
            return $blog->with(['seoMetaTags', 'tags'])->where('slug', $slug)->first();
        });

        return (new BlogPostResource($blogPost))
            ->response()
            ->setStatusCode(Response::HTTP_OK)
            ->setEtag(Hash::make($blogPost))
            ->setLastModified($blog->updated_at);
    } else {
        return response()->json()
            ->setLastModified($blog->updated_at)
            ->setStatusCode(Response::HTTP_NOT_MODIFIED);
    }
}

Пришлось писать этот код без неудачного теста, потому что я не могу понять Как написать тест, который утверждает, что "Кэш был пропущен". Я пытался проверить, было ли запущено событие Illuminate\Cache\Events\CacheMissed; нет успеха Вот код теста, который не проходит

public function testFirstGetFiresCacheMiss()
{
    $blogPost = factory(BlogPost::class)->create();
    $blogPost->seoMetaTags()->save(
        new SEOMetaTag(['name' => 'foo','value'=>'bar']),
    );
    $blogPost->attachTags(['devops','agile']);
    Passport::actingAs(factory(User::class)->create());
    $response = $this->withHeaders([
        'If-Modified-Since' => Carbon::yesterday(),
    ])->getJson('/api/blogs/'.$blogPost->slug);

    $this->expectsEvents(CacheMissed::class);
}

и вторая версия

public function testFirstGetFiresCacheMiss()
{
    $blogPost = factory(BlogPost::class)->create();
    $blogPost->seoMetaTags()->save(
        new SEOMetaTag(['name' => 'foo','value'=>'bar']),
    );
    $blogPost->attachTags(['devops','agile']);
    Passport::actingAs(factory(User::class)->create());
    Event::fake([
        CacheMissed::class,
    ]);
    $response = $this->withHeaders([
        'If-Modified-Since' => Carbon::yesterday(),
    ])->getJson('/api/blogs/'.$blogPost->slug);

    Event::assertDispatched(CacheMissed::class,1);
}

Ошибка одинакова в любом случае These expected events were not fired: [Illuminate\Cache\Events\CacheMissed]

1) Тесты \ Feature \ Controllers \ BlogPostControllerTest :: testFirstGetFiresCacheMiss Эти ожидаемые события не были запущены: [Illuminate \ Cache \ Events \ CacheMissed] Не удалось подтвердить, что массив пуст.
/ Users / anadi / Code / github / website / adminpanel / vendor /laravel/framework/src/Illuminate/Foundation/Testing/Concerns/MocksApplicationServices.php:61
/ Пользователи / anadi / Код / github / веб-сайт / adminpanel / vendor / laravel / framework / src / Illuminate / Foundation / Testing / TestCase. php: 233
/Users/anadi/Code/github/website/adminpanel/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestCase.php:149

НЕИСПРАВНОСТИ!
Тесты: 1, Утверждения: 4, Сбои: 1.

...