Testing Laravel - 測試 Controller
Testing Laravel - 測試 Controller本文章使用的開發環境為PHP : 8.0.8Laravel : 8.51.0
在 Laravel 的開發過程中我們想要對 response 寫測試的時候,比較常見的是使用官方 HTTP Tests 章節內提到對於 api 回傳的 json 去做驗證
但我們也很常遇到前後端沒有拆分的那麼乾淨的專案,這樣的專案會使用 SSR(Server Side Render) 形式去回傳 response ,這時候我們通常會在 laravel 的 controller 回傳一個 view 然後夾帶一些需要使用的參數
假設我們今天的 web.php 有一個 route
web.php
1Route::get('demo_controller_test', DemoTestController::class);
對應到我們的 DemoTestController
DemoTestController
12345678910111213class DemoTestController extends Controller& ...
金魚腦記不住想要 ssh 的 ip ?
金魚腦記不住想要 ssh 的 ip ?筆者開發的情境時常會需要去連線不同的主機,所以必須要去記憶很多組主機的 ip ,這樣在使用 ssh 的時候才有辦法知道要連線的目標,但是 ip 實在是太難記憶了
這時候我們可以透過設定 ssh config 來減輕我們腦袋的負擔
12cd ~/.sshvim config
我們可以新增設定的形式
config
1234Host devHostname 127.0.0.1identityfile ~/.ssh/id_rsaUser mobius
Host:你想要設定的主機名稱
Hostname: ip
identityfile: 連線主機用的 key 存放位置
User: 用來登入的 user name
如果想要設定多組的話就是往下持續遞增這樣的區塊就可以了
config
123456789Host devHostname 127.0.0.1identityfile ~/.ssh/id_rsaUser mobiusHost productionHostname 123.123.123.123identityfile ~/.ssh/id_rsa ...
單元測試的藝術 - Ch8 好的單元測試的支柱 - Sec. 8.2 撰寫可維護的測試
單元測試的藝術 - Ch8 好的單元測試的支柱 - Sec. 8.2 撰寫可維護的測試隨著時間推移,測試會變得難以理解及維護,所以可維護性是大多數開發人員撰寫單元測試的核心問題之一。
8.2.1 測試私有或保護的方法在測試時,你應該只考慮公開契約(整體功能),因爲私有方法不會獨立存在,他必定會被某個公開方法或是私有方法呼叫,也就是說,任何私有方法通常都是更大的工作單元的使用案例的一部分。
如果一個私有方法值得被測試,那他也許應該是公開的、靜態的,或是至少是內部的( internal ),或者應該將它獨立到另一個類別中。
讓方法變成公開方法如果你覺得某個私有方法具有被測試的價值,那可能表示這個方法對於呼叫端來說有某種已知的行為或契約的效用,將這個方法改成公開的,代表正式將契約對外開放
把方法抽取到新類別中如果一個方法中包含了很多獨立職責的邏輯,或是類別的某些狀態只和這個方法有關,把這個方法抽取到另外一個具有特定功能的類別會更好,也符合單一職責原則。
把方法改成靜態方法如果一個方法沒有用到執行物件的任何變數跟狀態,那你可以考慮把它改為靜態方法,同時這也表示了這個方法為某種輔助方法。
把方法 ...
金魚腦記不住團隊 git 規範? 那就用 git template 吧
金魚腦記不住團隊 git 規範? 那就用 git template 吧常常我們在進行團隊協作開發的時候都需要遵循一定的 git commit 規範,而規範通常不是那麼容易被記住,這時候如果在 commit 的時候有人可以提醒我關於規範的大小事就好了
git template 正好可以拿來做這樣的事情,以下稍微介紹一下。
這邊假設我們的 commit 規範是使用 Angular Commit Guidelines 來做範例
多人協作下免不了的是我們必須要將 git commit 去做分類,已達到管理的目的,但你看看像是 Angular Commit Guidelines 的規範光是他的 commit type 就有非常多種
build: Changes that affect the build system or external dependencies (example scopes: gulp, broccoli, npm)
ci: Changes to our CI configuration files and scripts (example scopes: Travi ...
單元測試的藝術 - Ch6 深入瞭解隔離框架 - Sec. 6.3 ~ 6.5
單元測試的藝術 - Ch6 深入瞭解隔離框架 - Sec. 6.3 ~ 6.56.3 支援適應未來和可用性的功能一個好的測試框架會提供一些讓你可以因應未來變化的一些功能,如:
遞迴假物件
對行為和驗證忽略預設參數
非嚴格驗證與行為
大範圍偽造
6.3.1 遞迴假物件遞迴假物件是在函數回傳其他物件時的一種特殊行為,這些回傳物件會自動產生假物件。
Humanable.php
1234interface Humanable{ public function generatePerson(): Humanable;}
Person.php
123456class Person implements Humanable{ public function generatePerson(): Humanable { }}
Test
123456789101112131415161718192021222324/** * @test */public function GeneratePerson(){ ...
Laravel Helper - Str::limit() 在中文應用場景的大小事
Laravel Helper - Str::limit() 在中文應用場景的大小事最近在開發上遇到了要擷取中文訊息內容預覽的問題,例如今天我有一個句子
萊布尼茨和牛頓都被普遍認為是獨立的微積分發明者。牛頓最先將微積分應用到普通物理當中,而萊布尼茨創作了不少今天在微積分所使用的符號。牛頓、萊布尼茨都給出了微分、積分的基本規則,二階與更高階導數,近似多項式級數的記法等。在牛頓的時代,微積分基本定理是已知的事實。
擷取自 微積分 wiki
這很可能是某個文章的內容,而我在顯示頁面上的預覽只有要顯示部分的文字,例如前十個字好了,而且我想讓被隱藏的文字用「…」代替,我想顯示的內容大概如下
萊布尼茨和牛頓都被普…
這時候我們就需要用到 Laraevl Helper 裡面幫我們預先寫好的字串處理函式了
我們要使用的是 Str::limit() 這個函式,它可以幫助我們擷取某個字串的前幾個字,並且可以自定義超過字數之後的結尾
Str::limit先來看看官網的例子
12345use Illuminate\Support\Str;$truncated = Str::limit('The ...
單元測試的藝術 - Ch5 隔離框架 - Sec. 5.4 ~ 5.7
單元測試的藝術 - Ch5 隔離框架 - Sec. 5.4 ~ 5.7
5.4 測試事件相關的活動事件是雙向的,所以可以從兩個方面去進行測試
測試監聽事件的那一方
測試觸發事件的那一方
測試事件監聽者我們想檢查一個物件是否有註冊到另一個物件的事件
如果物件被註冊到另外一個物件,我們比較直覺的會想到去檢查物件內部狀態使否有該物件被註冊,但作者認為這是比較不好的方式
比較好的選擇是,檢查監聽物件是否對於發生的事件做出某種反應
1234567891011121314151617181920212223242526272829303132333435class Presenter{ private readonly IView _view; public Presenter(IView view) { _view = view; this._view.Loaded += OnLoaded; //註冊事件(OnLoaded) } private void OnLoaded() & ...
Working Effectively with Legacy Code - Ch25 - 解依賴技術 (6)
Working Effectively with Legacy Code - Ch25 - 解依賴技術 (6)21. 子類別化並覆寫方法「子類別化並覆寫方法」是物件導向程式中姐依賴的核心技術,這個手法就是讓我們可以在測試環境下,利用繼承將我們不關心的行為架空,或是覆寫你在乎的行為讓他可以達到感測的目的,事實上這本書中其他的很多手法都是這個手法的變形。
before上有許多方法,假設我們今天要加入測試的方法是 ```sendMessage()``` ,而他的過程中會呼叫一個私有方法 ```createForwardMessage()``` 去生成一個新的訊息,但過程中用到了 ```Session``` 物件,可是測試過程我們沒辦法對真正的 ```Session``` 去做操作。123456789101112131415161718192021222324252627282930313233343536373839**MessageForwarder**```php=class MessageForwarder{ public function sendMessage() ...
Working Effectively with Legacy Code - Ch25 - 解依賴技術 (5)
Working Effectively with Legacy Code - Ch25 - 解依賴技術 (5)17. 特性提升有時候我想為類別中的某些方法加入測試,但我在測試中必須要構築的依賴卻又跟我想測試的方法毫無關聯,這樣我勢必得花上大量的成本去對付這些依賴,而這樣做對測試目標的方法毫無幫助。
當然,這個時候我們可以透過「暴露靜態方法」或是「分解出方法物件」去應對,本節介紹另外一個可以嘗試的方法
before我們有一個 Scheduler 類別,我們想要修改 getDeadTime() ,但不關心 updateScheduleItem() ,而 updateScheduleItem() 的實作就是伴隨著某些麻煩的依賴,與 getDeadTime() 的實作完全沒有關聯
Scheduler
123456789101112131415161718192021222324252627282930313233343536373839404142434445class Scheduler{ /** * @var array */ private $ite ...
Working Effectively with Legacy Code - Ch25 - 解依賴技術 (4)
Working Effectively with Legacy Code - Ch25 - 解依賴技術 (4)13. 連接替換在物件導向的語言中有很多方法可以讓我們去替換物件,例如讓偽造的類別去實作與要替換的類別同一個物件,或是去繼承相同的基底類別,但在像是 C 這樣的程序式語言裡面卻沒辦法這麼做。
before例如下面這個函數,如果不用預處理手段,就完全沒辦法在編譯期將其替換為另一個函數
1void account_deposit(int amount)
after我們可以使用 連接替換(Link Subsitution) 來將他替換為另外一個函數。
首先要建立一個 啞元函式庫(dummy library) ,裡面放的假造函式簽章必須要跟原來的函式相同,並在偽造的函式內撰寫你用來感測的內容
12345678void account_deposit(int amount) { struct Call *call = (struct Call *)calloc(1, sizeof (struct Cal)); call->type = ACC_DEPOSIT; c ...