發表文章

如何正確在 Laravel 撰寫 PHPUnit 單元測試(Unit Test)

本篇文章內容主要參考自 LaracastsLaravel 5.4 From Scratch: Testing 101,並且替換掉舊有寫法,改寫成新版(Laravel 5.6)的版本。我們會撰寫一個簡單的 Unit Test 測試,可以在獨立的測試資料庫中測試 model 操作 CRUD,同時不會因為測試 Create 操作而造成資料庫無限肥大下去。建立測試案例先建立一個測試案例,本篇以單元測試為例建立一個 PostTest.php。# Create a test in the Unit directory... php artisan make:test PostTest --unit 規劃測試內容例如我們想要測試以下 Post model 的 method 是否正常:# app/Post.phppublicstaticfunctionarchives(){returnstatic::selectRaw('year(created_at) year, monthname(created_at) month, count(*) published')->groupBy('year','month')->orderByRaw('min(created_at) desc')->get()->toArray();}我們可以先依據 Given-When-Then 格式來撰寫註解,規劃好我們要寫的測試內容。關於 Given-When-Then 可以參考本篇文末 延伸閱讀 段落的整理。# tests/Unit/PostTest.phppublicfunctiontestArchives(){// Given I have two records in the database that art posts,// and each one is posted a month apart.// When I fetch the archives.// Then the response should be in the proper format.}建立測試資料在這裡,我們需要兩筆資料來測試。這時我們可以使用 Model Factories 來產生我們需要的測試資料到資料庫中。關於 Mod…
由於 Google+ 留言系統近期不會正常推送通知,請改用下方 DISQUS 留言,謝謝!

[筆記] 如何在 Laravel 測試中使用 Faker

圖片
是這樣的,我想在 Test 中產生一些假資料丟給 Service method 跑,於是很直覺地想到了 Faker 這個很棒很方便的東西。一般我們使用 Faker 是 搭配 Model Factory 使用。但是我這次只是想產生個簡單的假資料,跟我的資料庫或 Model 都沒有關係,有沒有辦法?只是放一個封面圖隆重介紹:WithFaker traitLaravel 從 5.5.24 版開始 已經內建了這個 trait,而且在你使用 artisan 指令建立測試檔案時就會自動幫你導入命名空間了:useIlluminate\Foundation\Testing\WithFaker;結果到現在已經 5.7 版了,竟然還沒有在教學文件出現過。可以自行參考 Laravel API 文件。如何使用 WithFaker現在只需使用 trait 在你的測試類別上,例如:# tests/Unit/ExampleTest.php// 上略classExampleTestextendsTestCase{useWithFaker;// 下略接著就可以透過 $this->faker 來操作 Faker 了,例如:echo$this->faker->name;// 'Lucy Cechtelar';echo$this->faker->address;// "426 Jordy Lodge// Cartwrightshire, SC 88120-6700"echo$this->faker->text;// Dolores sit sint laboriosam dolorem culpa et autem. Beatae nam sunt fugit// et sit et mollitia sed.// Fuga deserunt tempora facere magni omnis. Omnis quia temporibus laudantium// sit minima sint.是不是非常簡單呢?參考資料Laravel - How to use faker in PHPUnit test? - Stack OverflowLaravel Changelog 在 Twitter:laravel 5.5.24 …

[筆記] Faker 如何產生 10 位數以上的 random number?

在寫 Laravel 測試需要的 Factory 時,有個欄位需要 16 位數以下的數字。一般來說直接透過 fzaninotto/Faker 的 randomNumber 就可以很方便的生成了:$number=$faker->randomNumber(16);結果執行的時候竟然噴錯了!InvalidArgumentException: randomNumber() can only generate numbers up to mt_getrandmax()mt_getrandmax() 是什麼錯誤訊息中提到的 mt_getrandmax() 是 PHP 的內建函式,會回傳 PHP 透過 mt_rand() 可以產生的最大數。這個 mt_rand() 就是一般的隨機產生函式,只要有指定 min 和 max,其實他是可以產生更大數的,不是很理解為什麼 Faker 沒有做這個處理。可以怎麼做?這裡我想了幾個方法,可以給各位參考。方法一:直接使用 mt_rand 或 random_int既然他背後是使用 mt_rand(),那就直接使用它吧。$number=mt_rand(1,9999999999999999);不過我實際使用發現,雖然我是只有上限給了 16 位數,他產生的結果好像是固定十六位數。後來嘗試了 PHP 7 新的 random_int,結果差不多。$number=random_int(1,9999999999999999);PHP 官網文件在 mt_getrandmax 的頁面上有提及,如果提供 MAX 給 mt_rand 會減少隨機性,不知道是不是這個原因。方法二:使用 numberBetweenFaker 有提供 numberBetween,所以可以直接使用:$number=$faker->numberBetween(1,9999999999999999);因為 numberBetween 也是基於 mt_rand,我實測結果好像只比 mt_rand 好一點。以上兩個方法如果有人知道如何修正,再麻煩留言跟我說一下。方法三:使用 numerify這個是 Faker 作者在 類似的 issue 裡提出的做法,我把它替換成這個情境的解法。numerify 是 Faker 的另一個函式,可以在字串的指定位置裡塞入數字。官方範例:numerify(&…

[筆記] 設定了 POWERLEVEL9K_MODE 卻沒顯示圖示?

圖片
裝了 Oh My Zsh 後,應該很自然地都會想要裝上 Powerlevel9k 吧(咦?
然後也會很自然地想要把圖示通通都打開對吧(咦咦?這時候就會發現,奇怪我都已經照官方教學把 POWERLEVEL9K_MODE 設定的妥妥了(順便曬一下我陽春的 Powerlevel9k 設定):# ~/.zshrc POWERLEVEL9K_MODE='nerdfont-complete' POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(os_icon context virtualenv dir vcs) POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(status root_indicator background_jobs time) POWERLEVEL9K_SHORTEN_DIR_LENGTH=2 POWERLEVEL9K_CONTEXT_TEMPLATE="%n" POWERLEVEL9K_PROMPT_ON_NEWLINE=true POWERLEVEL9K_RPROMPT_ON_NEWLINE=false 怎麼還是沒有圖勒
我意思是,像下面官方示範的各種精美圖示,怎麼還是沒有出來勒?
原來是 官方 Wiki 安裝說明 針對 Nerd-Fonts 的段落忘記強調一句話,而在 Awesome-Powerline Fonts 段落有提及:You then need to indicate that you wish to use the additional glyphs by defining one of the following in your ~/.zshrcbefore you specify the powerlevel9k theme意思是,POWERLEVEL9K_MODE必須要比 ZSH_THEME 還前面啦!以我的例子為例,只要把POWERLEVEL9K_MODE='nerdfont-complete'這一行往前搬,像這樣:POWERLEVEL9K_MODE='nerdfont-complete' ZSH_THEME="powerlevel9k/powerlevel9k"現在圖示就正常顯示啦!
由於 Google+ 留言系統近期不會正常推送通知,請改用下方 DISQUS 留言,謝謝!

[筆記] Facebook Open Graph 的 og:locale 該如何設定?

圖片
Facebook 的開放社交關係圖(Open Graph)針對 og:locale 的規範不曉得是不是有更新,以至於檢查網頁抓取資訊的時候噴了一個我沒看過的錯:
「 website 」類型的 URL「 https://www.example.com 」無效,因為「 og:locale:locale 」特性的指定值「 XX 」無法作為「 enum 」類型進行剖析。
Object at URL ‘https://www.example.com’ of type ‘website’ is invalid because the given value ‘XX’ for property ‘og:locale:locale’ could not be parsed as type ‘enum’.查了一下發現是語言格式錯了,Facebook 的格式不是完全依照 ISO 標準,依據本地化文件的說明:Facebook 上的語言使用 ll_CC 格式,ll 是兩個字母的語言代碼,CC 是兩個字母的國家/地區代碼。例如,en_US 代表美式英文。 我們支援許多 ISO 語言和國碼/區碼從 SDK 文件裡面可以看到目前 Facebook 支援的 og:locate 列舉如下:Allowed values: en_us, ca_es, cs_cz, cx_ph, cy_gb, da_dk, de_de, eu_es, en_pi, en_ud, ck_us, es_la, es_es, es_mx, gn_py, fi_fi, fr_fr, gl_es, ht_ht, hu_hu, it_it, ja_jp, ko_kr, nb_no, nn_no, nl_nl, fy_nl, pl_pl, pt_br, pt_pt, ro_ro, ru_ru, sk_sk, sl_si, sv_se, th_th, tr_tr, ku_tr, zh_cn, zh_hk, zh_tw, fb_lt, af_za, sq_al, hy_am, az_az, be_by, bn_in, bs_ba, bg_bg, hr_hr, nl_be, en_gb, eo_eo, et_ee, fo_fo, fr_ca, ka_ge, el_gr, gu_in, hi_in, is_is, id_id, ga_ie, …

[筆記] 延長 PHP-FPM 和 NGINX 執行時間上限

Laravel 或是一般 PHP 專案上常會遇到執行時間超時的問題,
例如遇到了 PHP 超過執行時間上限的錯誤:'production.ERROR: Maximum execution time of 30 seconds exceeded'或是遇到 NGINX 的超時錯誤:'504 Gateway Time-out'是因為 PHP 和 NGINX 預設最長執行時間都是 30 秒,我們可以修改設定來延長它們。這裡我們延長到 Apache、IIS 慣例的 5 分鐘。這個主題其實很多人寫了,但是資訊有點零散,乾脆自己再寫一篇方便以後找。(感覺就是很常會改啊)PHP: 延長 max_execution_timePHP 的 runtime 設定中的 max_execution_time 參數可以指定腳本被 parser 中止之前允許的最大執行時間,預設值是 30 秒。我們可以透過修改 php.ini 指定為 300 秒。修改 php.ini以 PHP 7.2 為例,php.ini 的位置預設是在 /etc/php/7.2/cli/php.ini。php.ini 的位置可以經由 php -i 指令查詢的到。順帶一提,PHPBrew 使用者可以透過 phpbrew config 指令直接開啟當前版本對應的 php.ini。; /etc/php/7.2/cli/php.ini;;;;;;;;;;;;;;;;;;;; Resource Limits ;;;;;;;;;;;;;;;;;;;;; Maximum execution time of each script, in seconds; http://php.net/max-execution-time; Note: This directive is hardcoded to 0 for the CLI SAPImax_execution_time= 300重新啟動 PHP-FPM修改完成後,需要重新啟動 PHP-FPM。PHPBrew 使用者phpbrew fpm restart Ubuntu/Debian 系sudoservice php7.2-fpm restart CentOS/RHEL 7 系sudo systemctl restart php-fpm NGINX: 延長 fas…

小克的 Visual Studio Code 必裝擴充套件(Extensions)私藏推薦

圖片
沒錯,又是私藏推薦系列,不過這次是 Visual Studio Code。
(上一篇:小克 2017 不能沒有、2018 一定繼續用的必裝 app 下載私藏推薦 (Android/iOS))從 Sublime Text 3 跳到 VS Code 一陣子了,在微軟及社群頻繁的維護與更新下,總算是越用越順手。VS Code 擴充功能(Extensions,俗稱擴充套件)的生態也算是越來越完整,一點也不輸給 Sublime Text 或是 Atom 的外掛或擴充套件。算一算裝的擴充功能也有數十種了,到了要整理的地步(笑),那就寫一篇來記錄一下好了,這篇也會持續更新。我平時主力為 Laravel/PHP 開發,所以會有比較多 Laravel 和 PHP 的相關套件。所以以下就是我的私人珍藏、必裝、必備、必下載、不裝不行的 VS Code 擴充功能。(直接拿 app 那篇來改 XDDD)
如果你有喜歡的其他擴充功能沒列到,也歡迎留言告訴我(各種方面的都歡迎建議)
來放一個官方的圖給 Facebook 抓預覽Changelog2018.08.03 新增 PHPUnit Snippets2018.08.03 將 Better PHPUnit 替換成更好用的 VSCode PHPUnit2018.04.02 裝回 Git History2018.03.27 使用者設定中新增 emmet 和 trimTrailingWhitespace 設定2018.03.24 新增使用者設定2018.03.24 新增 Fira Code2018.03.24 初版效率提升強烈推薦類這個區塊表列的,應該是不裝我會覺得渾身不對勁的的擴充功能 😂Fira Code安裝方法在此
首先推薦的這個不是套件,而是字體,強烈建議安裝,爽度提昇超多!
Settings Sync
如果你有多台電腦,可以幫你同步設定檔和安裝的套件(透過 GitHub Gist),支援背景自動同步
Auto Close Tag
被 Sublime Text 慣壞的必裝,會幫你把右括號或結束標籤補上。現在 VS Code 有內建基本補完功能了,但是他支援更多符號和設定,例如我喜歡打 </ 的時候也幫我補上 HTML close tag。
Guides
這工具我找超久!在你的程式開關符號(例如左右大括號)拉一條線,方便你識別程式區塊
由於 Google+ 留言系統近期不會正常推送通知,請改用下方 DISQUS 留言,謝謝!