iT邦幫忙

2023 iThome 鐵人賽

DAY 15
0
Software Development

開心撰寫 PHPUnit系列 第 15

Day 15. 暫停一下 - 為什麼不一開始就使用 PHPVCR

  • 分享至 

  • xImage
  •  

這 14 天以來的文章我們可以練習到

  1. 使用 cli 執行 PHPUnit
  2. VSCode 使用 PHPUnit Test Explorer 執行 PHPUnit
  3. 利用 Extract Method 來輔助開發
  4. 利用 class extends 產生一個 Fake 物件來輔助開發
  5. 利用 Mockery::mock 來輔助開發
  6. 利用 Mockery::spy 來驗證參數是否正確
  7. 利用 PHPVCR 來輔助開發

同時我們也已經在不知不覺中也用上了 SOLID 的其中幾個原則

  • 單一職責原則(The Single Responsibility Principle, 簡稱 SRP)
  • 里氏替換原則 (The Liskov Substitution Principle, 簡稱 LSP)
  • 依賴倒置原則 (The Dependency Inversion Principle, 簡稱 DIP)
  • 接口隔離原則 (Interface Segregation Principle, 簡稱 ISP)

只要『正確』的使用工具開發完程式後並加以重構,design pattern 就會自然出現的。

這也是為什麼不從一開始就使用 PHPVCR,如果我們從一開始就使用 PHPVCR 我們會有很高的概率寫出這樣的程式碼

<?php

namespace Recca0120\Ithome30\Tests;

use PHPUnit\Framework\TestCase;
use Recca0120\Ithome30\PttCrawler;

class PttCrawlerTest extends TestCase
{
    public function test_fetch_board_page()
    {
        \VCR\VCR::turnOn();
        \VCR\VCR::insertCassette('ptt_home.yaml');

        $crawler = new PttCrawler();
        $records = $crawler->all();

        self::assertEquals([
            'name' => 'Gossiping',
            "nuser" => '11296',
            'class' => '綜合',
            'title' => '[八卦] 為國慶賀 抬離訓練編組!',
        ], $records[0]);

        \VCR\VCR::eject();
        \VCR\VCR::turnOff();
    }
}
<?php

namespace Recca0120\Ithome30;

class PttCrawler
{
    public function __construct()
    {
    }

    public function all()
    {
        $html = file_get_contents('https://www.ptt.cc/bbs/hotboards.html');

        return array_map(
            fn (string $row) => $this->parseCols($row),
            $this->parseRows($html)
        );
    }

    private function parseCols($row)
    {
        preg_match_all('/"board-(?<name>\w+)">(?<value>.+?)<\/div>/', $row, $matches);
        $cols = [];
        foreach (array_keys($matches[0]) as $index) {
            $name = $matches['name'][$index];
            $value = $matches['value'][$index];
            $cols[$name] = str_replace('◎', '', strip_tags($value));
        }

        return $cols;
    }

    private function parseRows($html)
    {
        preg_match_all('/<a\sclass="board"[^>]*>.+?<\/a>/s', $html, $matches);

        return $matches[0];
    }
}

我們光看程式碼來說,結構還是非常不錯的,但立刻違反了單一職責這個原則了。

所以正確的使用方法非常重要,我們必須先理解正確的使用方法後,再去找輔助工具來加速開發,絕對不能因為輔助工具好用就忽略掉正確的使用方法,這點非常重要啊


上一篇
Day14. 重構爬蟲測試 - 爬蟲的利器 PHPVCR
下一篇
Day 16. 爬蟲 - 用 TDD 的方式來思考
系列文
開心撰寫 PHPUnit30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言