如果跟著教學書籍《Laravel 啟動與運行》,會發現書中使用的測試函式跟我昨天文章的並不相同,這是因為從 Laravel 5.4 開始,測試的函式介面有些改變。
教學書很有用,但並不會跟著軟體的版本更新而改變,因此根據書上學完邏輯後,實戰時最後一定都還是需要直接參考到官方的文件。
另外此篇文章撰寫時,最新的版本分別是 PHP 7.3、Laravel 6.0 ,該書撰寫時則是 PHP 5.6、Laravel 5.3。
根據 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 原本的函式還是可以用,但是需要額外下載套件來幫忙。
在我前一篇的範例中,是使用 get('/')
及 assertSee('TDD_Blog')
,其實 visit()
的用法也很接近。
$this->visit('/')->see('TDD_Blog');
但是如果之前的測試都是用 5.3 寫的,可能有更多不相容的地方要修改。
因此官方文件給出兩個方法,可以繼續在 Laravel 5.4 以後的版本使用舊的測試函式。
我們來介紹第一種:
安裝輔助套件,
$ 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()
的行為是不同的。
讓我們明天繼續。