Я использую кэширование для запросов к базе данных в своем приложении 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.