Using Composer Learning Unit Test Part 2

PHP Unit Test

  • 要如何直接用assertEquals的function呢?
    • 因為每一次都會用到$this->assertEquals()有點多餘
    • 找到實際定義assertEquals的function整理成一個檔案
    • 讓phpunit.xml直接參考到bootstrap.php自定義的檔案
1
2
3
4
// tests/bootstrap.php
require __DIR__.'/../vendor/autoload.php';
require __DIR__.'/../vendor/phpunit/phpunit/src/Framework/Assert/Functions.php';

  • 測試的種類

    • Unit Test < Integration Test < Function Test < Acceptance Test
    • Unit Test
      • Basic Test
    • Integration Test
      • 測試兩個獨立系統是否能正常運作
    • Function/Acceptance Test
      • 測試過Unit Test和Integration Test不一定這一階段就會過
      • Acceptance Test/配合Selenium測試UI
  • mock的概念

    • 不在乎run的內容,只關注那個function是否有被呼叫到了
    • swap out the actual action
    • 和new 物件的作法比較(會實際呼叫到物件定義的方法)
    • 可以用於依賴注入(controller有使用到其他物件的資料)
1
2
3
4
5
6
$mock = Mockery::mock('MockDependency\Type\StripeBilling'); //要寫完整路徑
$mock->shouldReceive('charge')->once()->andReturn('mocked Billing by Test');
$purchase = new PurcharseController($mock);
$result = $purchase->buy();
var_dump($result);

  • 依賴注入
    • 如果有定義新的namespace,記得先用composer dump,autoload才找的到檔案
    • 如果程式有在classmap中定義,require的時候就不用寫__DIR__取路徑
    • Single Responsibility
  • 驗證controller的時候,記得加上return返回結果
    • mock andReturn最後不會返回一個值,不需要再用一個變數來接
    • php指令+檔案位置來確認是否頁面能正常執行
1
2
3
4
5
6
7
// 方法1:未使用依賴注入的寫法
require 'vendor/autoload.php';
$controller = new PurcharseController();
var_dump($controller->buy());
// 方法2:使用依賴注入
require 'vendor/autoload.php';
var_dump((new PurcharseController(new StripeBilling))->buy());