iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 15
0
Software Development

如何一步步實踐TDD (測試驅動開發)系列 第 15

Laravel:消失的 visit() 函式

如果跟著教學書籍《Laravel 啟動與運行》,會發現書中使用的測試函式跟我昨天文章的並不相同,這是因為從 Laravel 5.4 開始,測試的函式介面有些改變。

教學書很有用,但並不會跟著軟體的版本更新而改變,因此根據書上學完邏輯後,實戰時最後一定都還是需要直接參考到官方的文件。

另外此篇文章撰寫時,最新的版本分別是 PHP 7.3、Laravel 6.0 ,該書撰寫時則是 PHP 5.6、Laravel 5.3。


Laravel 5.4

根據 Laravel 5.4 Upgrade Guide的 Testing 部分:

Laravel 5.4's testing layer has been re-written to be simpler and lighter out of the box. If you would like to continue using the testing layer present in Laravel 5.3, you may install the laravel/browser-kit-testing package into your application.

5.4 開始測試層被改寫了,5.3 原本的函式還是可以用,但是需要額外下載套件來幫忙。

visit()

在我前一篇的範例中,是使用 get('/')assertSee('TDD_Blog'),其實 visit() 的用法也很接近。

$this->visit('/')->see('TDD_Blog');

但是如果之前的測試都是用 5.3 寫的,可能有更多不相容的地方要修改。

browser-kit-testing

因此官方文件給出兩個方法,可以繼續在 Laravel 5.4 以後的版本使用舊的測試函式。

  1. browser-kit-testing
  2. dusk

我們來介紹第一種:

安裝輔助套件,

$ composer require --dev laravel/browser-kit-testing

安裝完還沒結束,接著在 tests/ 新增一個 BrowserKitTestCase.php 檔案。

<?php
// tests/BrowserKitTestCase.php

namespace Tests;

use Illuminate\Contracts\Console\Kernel;
use Laravel\BrowserKitTesting\TestCase as BaseTestCase;

abstract class BrowserKitTestCase extends BaseTestCase
{
    /**
     * The base URL of the application.
     *
     * @var string
     */
    public $baseUrl = 'http://localhost';

    /**
     * Creates the application.
     *
     * @return \Illuminate\Foundation\Application
     */
    public function createApplication()
    {
        $app = require __DIR__.'/../bootstrap/app.php';

        $app->make(Kernel::class)->bootstrap();

        return $app;
    }
}

測試的部分,繼承的物件要從原本 Laravel 的 TestCase 改成剛剛新增的 BrowserKitTestCase,然後就可以把就可以把我們的測試,改成舊版的函式了。

<?php
// tests/Feature/IndexTest.php

namespace Tests\Feature;

use Tests\BrowserKitTestCase;

class IndexTest extends BrowserKitTestCase
{
    /**
     * @return void
     */
    public function testTitle()
    {
        $this->visit('/')->see('TDD_Blog');
    }
}

不過還是建議大家學新的用法,Laravel 這樣的更新有他的道理,而且實際上 visit()get() 的行為是不同的。

讓我們明天繼續。


上一篇
TDD 實戰 D1:Laravel 首頁
下一篇
TDD 實戰 D2:Laravel 資料庫 (1)
系列文
如何一步步實踐TDD (測試驅動開發)30

尚未有邦友留言

立即登入留言