發表文章

目前顯示的是 9月, 2018的文章

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

圖片
是這樣的,我想在 Test 中產生一些假資料丟給 Service method 跑,於是很直覺地想到了 Faker 這個很棒很方便的東西。 一般我們使用 Faker 是 搭配 Model Factory 使用 。但是我這次只是想產生個簡單的假資料,跟我的資料庫或 Model 都沒有關係,有沒有辦法? 只是放一個封面圖 隆重介紹:WithFaker trait Laravel 從 5.5.24 版開始 已經內建了這個 trait,而且在你使用 artisan 指令建立測試檔案時就會自動幫你導入命名空間了: use Illuminate \ Foundation \ Testing \ WithFaker ; 結果到現在已經 5.7 版了,竟然還沒有在教學文件出現過。可以自行參考 Laravel API 文件 。 如何使用 WithFaker 現在只需使用 trait 在你的測試類別上,例如: # tests/Unit/ExampleTest.php // 上略 class ExampleTest extends TestCase { use WithFaker ; // 下略 接著就可以透過 $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

[筆記] 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 會減少隨機性,不知道是不是這個原因。 方法二:使用 numberBetween Faker 有提供 numberBetween ,所以可以直接使用: $number = $faker - > numberBetween ( 1 , 9999999999999999 ) ; 因為 numberBetween 也是基於 mt_rand ,我實測結果好像只比 mt_rand 好一點。 以上兩個方法如果有人知道如何修正,再麻煩留言跟我說一下。 方法三:使用