PHPUnit 自動化測試大作戰【CH20】

更新 發佈閱讀 11 分鐘

今天來看 Queue Mocking 吧!

Queue Mocking 函數

  • Queue::fake():當我們希望在執行測試目標行為時,想驗證某個 Job 類別是否有被派送至佇列中,但又不要真的觸發 Job 入列時,可在測試程式碼中呼叫此函數。
  • Queue::assertPushed():可驗證指定的 Job 類別是否被配送至佇列。需在執行 Queue::fake() 後方可使用。
  • Queue::assertPushedOn():可驗證指定的 Job 類別是否被配送至指定的佇列。需在執行 Queue::fake()後方可使用。
  • Queue::assertNotPushed():可驗證指定的 Job 類別是否未被配送至佇列。需在執行 Queue::fake() 後方可使用。
  • Queue::assertNothingPushed():可驗證是否無 Job 類別被配送至佇列。需在執行 Queue::fake() 後方可使用。

接下來讓我們實際演練看看吧!

範例:文章瀏覽計數

測試目標:文章瀏覽記錄端點

  • database/migrations/2022_10_02_174939_create_articles_table.php
<?php

use Illuminate\Database\Migrations\Migration;

use Illuminate\Database\Schema\Blueprint;

use Illuminate\Support\Facades\Schema;

return new class extends Migration{

/** * Run the migrations. * * @return void */

public function up() {

Schema::create('articles', function (Blueprint $table) {

$table->id();

$table->text('content');

$table->integer('page_views');

$table->timestamps();

}); } /** * Reverse the migrations. * * @return void */

public function down() {

Schema::dropIfExists('articles');

}};
  • app/Models/Article.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;

use Illuminate\Database\Eloquent\Model;

class Article extends Model{

use HasFactory;

protected $fillable = [

'content',

'page_views',

];}
  • database/factories/ArticleFactory.php
<?php

namespace Database\Factories;

use Illuminate\Database\Eloquent\Factories\Factory;

/** * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Article> */

class ArticleFactory extends Factory{

/** * Define the model's default state. * * @return array<string, mixed> */

public function definition() {

return [

'content' => $this->faker->text,

'page_views' => 0,

]; }}
  • app/Jobs/AddArticlePageViewJob.php
<?php

namespace App\Jobs;

use App\Models\Article;

use Illuminate\Bus\Queueable;

use Illuminate\Contracts\Queue\ShouldBeUnique;

use Illuminate\Contracts\Queue\ShouldQueue;

use Illuminate\Foundation\Bus\Dispatchable;

use Illuminate\Queue\InteractsWithQueue;

use Illuminate\Queue\SerializesModels;

class AddArticlePageViewJob implements ShouldQueue{

use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

private $article;

/** * Create a new job instance. * * @return void */

public function __construct(Article $article) {

$this->article = $article;

} /** * Execute the job. * * @return void */

public function handle() {

$this->article->page_views += 1;

$this->article->save();

}}
  • routes\api.php
<?php

use App\Jobs\AddArticlePageViewJob;

use App\Models\Article;

use Illuminate\Http\Request;

use Illuminate\Support\Facades\Route;

Route::post('/article/{id}/page-view', function (Request $request, $id) {

$article = Article::find($id);

if (empty($article)) {

return response()->json([], 404);

} AddArticlePageViewJob::dispatch($article)->onQueue('redis');

return response('', 200);

});
  • 測試程式碼:
<?php

namespace Tests\Feature;

use App\Jobs\AddArticlePageViewJob;

use App\Models\Article;

use Illuminate\Foundation\Testing\RefreshDatabase;

use Illuminate\Support\Facades\Queue;

use Tests\TestCase;

class QueueTest extends TestCase{

use RefreshDatabase;

public function testDispatchAddArticlePageViewJob() {

$article = Article::factory()->create();

Queue::fake();

$response = $this->post(route('add-article-page-views', ['id' => $article->id]));

$response->assertOk();

Queue::assertPushedOn('redis', AddArticlePageViewJob::class);

} public function testNotDispatchAddArticlePageViewJob() {

$article = Article::factory()->create();

Queue::fake();

$response = $this->post(route('add-article-page-views', ['id' => $article->id . '0']));

$response->assertNotFound();

Queue::assertNotPushed(AddArticlePageViewJob::class);

}}

以上測試程式碼,測試了 2 種測試案例:

  • testDispatchAddArticlePageViewJob():在這個測試案例函數中,我們驗證了當文章瀏覽記錄端點被請求,且文章存在時,有發送AddArticlePageViewJob 這個 Job 類別。
  • testNotDispatchAddArticlePageViewJob():在這個測試案例函數中,我們驗證了當文章瀏覽記錄端點被請求,且文章不存在時,沒有發送AddArticlePageViewJob 這個 Job 類別。

以上就是今天所介紹的 Queue Mocking,大家可以多加演練。

下一篇讓我們來看看Storage Mocking 與 HTTP Mocking。

如果您喜歡這篇文章,歡迎加入追蹤以接收新文章通知 😄

參考資料

本系列文章目錄

留言
avatar-img
留言分享你的想法!
avatar-img
WilliamP的沙龍
13會員
573內容數
歡迎來到 WilliamP 的沙龍天地,在這裡將與各位讀者探討各種主題,包刮高中數學題庫、PHP開發經驗、LINE聊天機器人開發經驗、書摘筆記等,歡迎交流!
WilliamP的沙龍的其他內容
2023/12/18
在前一篇文章中,我們探討了多重資料庫連線情境下,Model 及 Database Assertion 的應對方式,不過實際上筆者認為比較有難度的,其實是 Migration 應對方式。 今天就讓我們來探討這部分吧! Migration 應對方式 對於多重資料庫連線這種情境,筆者實務上做過的對應
2023/12/18
在前一篇文章中,我們探討了多重資料庫連線情境下,Model 及 Database Assertion 的應對方式,不過實際上筆者認為比較有難度的,其實是 Migration 應對方式。 今天就讓我們來探討這部分吧! Migration 應對方式 對於多重資料庫連線這種情境,筆者實務上做過的對應
2023/12/18
今天讓我們探討「缺乏 Migration Files 與 Factory Files」的 Legacy 情境吧! 很多時候我們會遇到沒有 Migration Files 或 Factory Files 的 Legacy Codebase,原因大概有以下幾種: 該程式庫原本不是以 Laravel
2023/12/18
今天讓我們探討「缺乏 Migration Files 與 Factory Files」的 Legacy 情境吧! 很多時候我們會遇到沒有 Migration Files 或 Factory Files 的 Legacy Codebase,原因大概有以下幾種: 該程式庫原本不是以 Laravel
2023/12/18
在實務情境上,常會有在單一專案程式庫中,存取多個不同資料庫的使用情境,在這種情況下,我們通常會設置多個資料庫連線(Database Connection)設定。 在平常開發使用設很方便,但要做測試時就會發現一些問題: 在測試程式碼或 Seeder 中調用 factory() 時,都是在預設連線資
2023/12/18
在實務情境上,常會有在單一專案程式庫中,存取多個不同資料庫的使用情境,在這種情況下,我們通常會設置多個資料庫連線(Database Connection)設定。 在平常開發使用設很方便,但要做測試時就會發現一些問題: 在測試程式碼或 Seeder 中調用 factory() 時,都是在預設連線資
看更多
你可能也想看
Thumbnail
每次都很煩惱交換禮物要送什麼嗎?這次分享五款千元以下的質感好物,有香氛、海綿寶寶積木、質感可蒸可微波便當盒、吉卜力造型毛巾和實用包款,讓你輕鬆挑選聖誕節禮物💝
Thumbnail
每次都很煩惱交換禮物要送什麼嗎?這次分享五款千元以下的質感好物,有香氛、海綿寶寶積木、質感可蒸可微波便當盒、吉卜力造型毛巾和實用包款,讓你輕鬆挑選聖誕節禮物💝
Thumbnail
嗨大家!最近過得好嗎?我好久沒發文了!😀 正在進行一個月的歐洲旅行,這次橫跨三個國家,也發生不少有趣的事,接下來也會陸續整理發佈~ 今天想分享的是旅行中必備的好物,我也在旅途中親自進行實測, 希望透過這篇的購買清單,幫助到即將要規劃旅行的你:)
Thumbnail
嗨大家!最近過得好嗎?我好久沒發文了!😀 正在進行一個月的歐洲旅行,這次橫跨三個國家,也發生不少有趣的事,接下來也會陸續整理發佈~ 今天想分享的是旅行中必備的好物,我也在旅途中親自進行實測, 希望透過這篇的購買清單,幫助到即將要規劃旅行的你:)
Thumbnail
大家都知道要補充膠原蛋白,但步入中年後的我,肌膚的變化不只是「流失變快」,連狀態也開始慢慢改變。 後來才明白,原來膠原蛋白的補充不只要「吃對」,更要「吃對時間」。 就像肌膚保養會分成早晚程序,膠原的補充其實也需要「分時」進行,才能更貼近需求,效果也更好。 BEAUTY CLUB 讓我養成了「早
Thumbnail
大家都知道要補充膠原蛋白,但步入中年後的我,肌膚的變化不只是「流失變快」,連狀態也開始慢慢改變。 後來才明白,原來膠原蛋白的補充不只要「吃對」,更要「吃對時間」。 就像肌膚保養會分成早晚程序,膠原的補充其實也需要「分時」進行,才能更貼近需求,效果也更好。 BEAUTY CLUB 讓我養成了「早
Thumbnail
發現每天固定一個小動作,肌膚整體狀態真的會更穩定,照鏡子的心情也跟著好起來。 早上我習慣吃一包 TIMESEAL 早安膠原蛋白,粉末狀、很好入口,使用小分子技術,搭配維生素C與專利原料 ( 雙胜肽膠原、PANMOL® NADH)。對我來說,就是先把一天的彈潤感打好底,也讓整天狀態更有精神。 晚
Thumbnail
發現每天固定一個小動作,肌膚整體狀態真的會更穩定,照鏡子的心情也跟著好起來。 早上我習慣吃一包 TIMESEAL 早安膠原蛋白,粉末狀、很好入口,使用小分子技術,搭配維生素C與專利原料 ( 雙胜肽膠原、PANMOL® NADH)。對我來說,就是先把一天的彈潤感打好底,也讓整天狀態更有精神。 晚
Thumbnail
先前提到 Quasar 的 Dialog Plugin 很好用,再讓我補充一個用法。
Thumbnail
先前提到 Quasar 的 Dialog Plugin 很好用,再讓我補充一個用法。
Thumbnail
在這一章中,我們探討了 PHP 中的函數,包括函數的基本結構、不同的函數定義方式(如函數聲明、函數表達式、箭頭函數和匿名函數)以及如何呼叫函數。我們還討論了函數的參數處理方式,包括單個參數、多個參數、預設參數值和剩餘參數。此外,我們還介紹了函數的返回值,包括返回單個值、返回物件和返回函數的情況。
Thumbnail
在這一章中,我們探討了 PHP 中的函數,包括函數的基本結構、不同的函數定義方式(如函數聲明、函數表達式、箭頭函數和匿名函數)以及如何呼叫函數。我們還討論了函數的參數處理方式,包括單個參數、多個參數、預設參數值和剩餘參數。此外,我們還介紹了函數的返回值,包括返回單個值、返回物件和返回函數的情況。
Thumbnail
在這一章中,我們介紹了PHP中的流程控制語句,包括if、else if、else、三元運算子、switch語句、for迴圈、foreach迴圈、while迴圈、do-while迴圈、循環嵌套以及控制迴圈的語句如break、continue、goto和return。
Thumbnail
在這一章中,我們介紹了PHP中的流程控制語句,包括if、else if、else、三元運算子、switch語句、for迴圈、foreach迴圈、while迴圈、do-while迴圈、循環嵌套以及控制迴圈的語句如break、continue、goto和return。
Thumbnail
在網路速度有限的情況下,依序記錄不斷產生的資訊,能統計使用者在頁面上操作了哪些功能。
Thumbnail
在網路速度有限的情況下,依序記錄不斷產生的資訊,能統計使用者在頁面上操作了哪些功能。
Thumbnail
當我們架好站、WebService測試完,接著就是測試區域網路連線啦~
Thumbnail
當我們架好站、WebService測試完,接著就是測試區域網路連線啦~
Thumbnail
Function的使用方式
Thumbnail
Function的使用方式
Thumbnail
放鬆的週末,我與幾位同事決定提升我們的後端開發技巧,選擇了「日期範圍生成器」作為我們的小型實作。作為團隊中較有經驗的PHP工程師,我引領著團隊從基礎程式碼的撰寫開始,進而深入到物件導向的結構調整,最後提高程式可擴充性的挑戰。雖然過程中遇到不少困難,但我們通過不斷的討論和優化,最終成功克服了所有挑戰。
Thumbnail
放鬆的週末,我與幾位同事決定提升我們的後端開發技巧,選擇了「日期範圍生成器」作為我們的小型實作。作為團隊中較有經驗的PHP工程師,我引領著團隊從基礎程式碼的撰寫開始,進而深入到物件導向的結構調整,最後提高程式可擴充性的挑戰。雖然過程中遇到不少困難,但我們通過不斷的討論和優化,最終成功克服了所有挑戰。
Thumbnail
這篇要測試的工作流是Face Swap。
Thumbnail
這篇要測試的工作流是Face Swap。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News