回到最上方

文件

單元測試

介紹

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 包含了在測試環境的 sessioncache 設定檔案,在測試環境中這兩個檔案設置為 空陣列 (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 文件中找到。

討論