單元測試
介紹
Laravel 自己有建立單元測試,但也有支援 PHPUnit 單元測試,在你的應用程式已經有設定好 phpunit.xml
PHPUnit 單元測試的設定,除了 PHPUnit 外,Laravel 也使用了 Symfony HttpKernel 、 DomCrawler 及 BrowserKit 元件,讓你在測試的時候可以監看及操作你的視圖,以及模擬瀏覽器的行為。
在 app/tests
資料夾中有一個測試的範例檔,在安裝了新的 Laravel 應用程式後,只要在命令列執行 phpunit
指令即可執行測試。
定義並執行測試
只要在 app/tests
資料夾中建立新的測試檔案就可以建立測試案例,測試類別必須繼承 TestCase
類別,現在你可以像使用 PHPUnit 一樣去定義測試方法。
測試類別範例
class FooTest extends TestCase {
public function testSomethingIsTrue()
{
$this->assertTrue(true);
}
}
你可以在命令列執行 phpunit
指令,去執行應用程式所有的測試。
注意: 你可以定義自己的
setUp
方法,但確保你有呼叫母類別的parent::setUp
方法。
測試環境
在執行單元測試時,Laravel 將會自動設置環境參數為 測試 (testing)
模式,且 Laravel 包含了在測試環境的 session
及 cache
設定檔案,在測試環境中這兩個檔案設置為 空陣列 (array)
,意思是 session 或 cache 資料在測試時不會被保存下來,如果需要,你也可以自己配置其他的測試環境參數。
從測試呼叫路由
你可以使用 call
方法可以執行路由:
從測試中呼叫路由
$response = $this->call('GET', 'user/profile');
$response = $this->call($method, $uri, $parameters, $files, $server, $content);
你可以監看 Illuminate\Http\Response
物件:
$this->assertEquals('Hello World', $response->getContent());
你也可以在測試中呼叫控制器:
從測試中呼叫控制器
$response = $this->action('GET', 'HomeController@index');
$response = $this->action('GET', 'UserController@profile', array('user' => 1));
getContent
方法會回傳和回應相同的字串內容,如果你路由是回傳 視圖 (View)
,你可以使用 original
參數去存取這個視圖的資料:
$view = $response->original;
$this->assertEquals('John', $view['name']);
使用 callSecure
方法可以呼叫 HTTPS 的路由:
$response = $this->callSecure('GET', 'foo/bar');
DOM 爬行器
你可以呼叫路由並接收一個 "DOM 爬行器" 的實例,你可以使用這個實例去監控內容:
$crawler = $this->client->request('GET', '/');
$this->assertTrue($this->client->getResponse()->isOk());
$this->assertCount(1, $crawler->filter('h1:contains("Hello World!")'));
更多的 "DOM 爬行器" 相關資訊,請參考 官方文件。
模擬Facades
在測試時,你可能想要模擬呼叫 Laravel 靜態 Facade 方法,舉例來說,參考下列控制器的的動作:
public function getIndex()
{
Event::fire('foo', array('name' => 'Dayle'));
return 'All done!';
}
我們可以透過 shouldReceive
方法模擬呼叫在 Facade 中的 Event
類別,該方法會回傳一個 Mockery 模擬的實例。
模擬 Facade
public function testGetIndex()
{
Event::shouldReceive('fire')->once()->with(array('name' => 'Dayle'));
$this->call('GET', '/');
}
注意: 不可以模擬
Request
Facade,反之,你可以在執行測試時傳送你想要輸入資訊到call
方法中,代替Request
請求。
框架宣告
Laravel 提供幾個 宣告 (assert)
的方法,讓測試能夠變得更容易:
宣告回應為 OK
public function testMethod()
{
$this->call('GET', '/');
$this->assertResponseOk();
}
宣告回應狀態碼
$this->assertResponseStatus(403);
宣告回應重新導向
$this->assertRedirectedTo('foo');
$this->assertRedirectedToRoute('route.name');
$this->assertRedirectedToAction('Controller@method');
宣告回應帶有資料的視圖
public function testMethod()
{
$this->call('GET', '/');
$this->assertViewHas('name');
$this->assertViewHas('age', $value);
}
宣告回應 Session 中帶有資料
public function testMethod()
{
$this->call('GET', '/');
$this->assertSessionHas('name');
$this->assertSessionHas('age', $value);
}
輔助方法
TestCase
類別包含一些輔助方法讓你可以更容易測試你的應用程式:
你可以使用 be
方法去設為現在驗證登入的使用者:
設定現在驗證登入的使用者
$user = new User(array('name' => 'John'));
$this->be($user);
在測試中使用 seed
方法重新產生資料庫的測試資料:
在測試時重新產生資料庫的測試資料
$this->seed();
$this->seed($connection);
更多建立測試資料的資訊可以在 資料庫 Seeding 文件中找到。