鍍金池/ 教程/ PHP/ 單元測(cè)試
Laravel Cashier
Eloquent ORM
HTTP 響應(yīng)
發(fā)行說明
擴(kuò)展包開發(fā)
HTTP 控制器
事件
擴(kuò)展框架
Contracts
開發(fā)
配置
表單驗(yàn)證
錯(cuò)誤與日志
Hashing
貢獻(xiàn)指南
郵件
Session
遷移與數(shù)據(jù)填充
查詢構(gòu)造器
Redis
升級(jí)向?qū)?/span>
概覽
緩存
服務(wù)提供者
Envoy 任務(wù)執(zhí)行器
隊(duì)列
單元測(cè)試
服務(wù)容器
文件系統(tǒng) / 云存儲(chǔ)
認(rèn)證
請(qǐng)求的生命周期
加密
模板
視圖 (View)
Laravel Homestead
Laravel 安裝指南
介紹
Command Bus
分頁
輔助方法
應(yīng)用程序結(jié)構(gòu)
HTTP 路由
HTTP 請(qǐng)求
基本用法
本地化
HTTP 中間件
結(jié)構(gòu)生成器
Facades
Laravel Elixir

單元測(cè)試

介紹

Laravel 在建立時(shí)就有考慮到單元測(cè)試。事實(shí)上,它支持立即使用被引入的 PHPUnit 做測(cè)試,而且已經(jīng)為你的應(yīng)用程序建立了phpunit.xml 文件。

tests 文件夾有提供一個(gè)測(cè)試?yán)印T诎惭b新 Laravel 應(yīng)用程序之后,只要在命令行上執(zhí)行phpunit 來進(jìn)行測(cè)試流程。

定義并執(zhí)行測(cè)試

要建立一個(gè)測(cè)試案例,只要在tests 文件夾建立新的測(cè)試文件。測(cè)試類必須繼承自TestCase,接著你可以如你平常使用 PHPUnit 一般去定義測(cè)試方法。

測(cè)試類例子

class FooTest extends TestCase {

    public function testSomethingIsTrue()
    {
        $this->assertTrue(true);
    }

}

你可以從終端機(jī)執(zhí)行phpunit 命令來執(zhí)行應(yīng)用程序的所有測(cè)試。

注意: 如果你定義自己的setUp 方法, 請(qǐng)記得調(diào)用parent::setUp。

測(cè)試環(huán)境

當(dāng)執(zhí)行單元測(cè)試的時(shí)候,Laravel 會(huì)自動(dòng)將環(huán)境配置成testing。另外 Laravel 會(huì)在測(cè)試環(huán)境導(dǎo)入sessioncache 的配置文件。當(dāng)在測(cè)試環(huán)境里這兩個(gè)驅(qū)動(dòng)會(huì)被配置為array (空數(shù)組),代表在測(cè)試的時(shí)候沒有 session 或 cache 數(shù)據(jù)將會(huì)被保留。視情況你可以任意的建立你需要的測(cè)試環(huán)境配置。

testing 環(huán)境的變量可以在phpunit.xml 文件中配置。

從測(cè)試調(diào)用路由

從單一測(cè)試中調(diào)用路由

你可以使用call 方法,輕易地調(diào)用你的任何一個(gè)路由來測(cè)試:

$response = $this->call('GET', 'user/profile');

$response = $this->call($method, $uri, $parameters,  $cookies, $files, $server, $content);

接著你可以檢查Illuminate\Http\Response 對(duì)象:

$this->assertEquals('Hello World', $response->getContent());

從測(cè)試調(diào)用控制器

你也可以從測(cè)試調(diào)用控制器:

$response = $this->action('GET', 'HomeController@index');

$response = $this->action('GET', 'UserController@profile', array('user' => 1));

注意: 當(dāng)使用action 方法的時(shí)候,你不需要指定完整的控制器命名空間。只需要指定App\Http\Controllers 命名空間后面的類名稱部分。

getContent 方法會(huì)返回求值后的字串內(nèi)容響應(yīng)。如果你的路由返回一個(gè)View,你可以通過original 屬性訪問它:

$view = $response->original;

$this->assertEquals('John', $view['name']);

你可以使用callSecure 方法去調(diào)用 HTTPS 路由:

$response = $this->callSecure('GET', 'foo/bar');

模擬 Facades

當(dāng)測(cè)試的時(shí)候,你或許常會(huì)想要模擬調(diào)用 Laravel 靜態(tài) facade。舉個(gè)例子,思考下面的控制器行為:

public function getIndex()
{
    Event::fire('foo', ['name' => 'Dayle']);

    return 'All done!';
}

我們可以在 facade 上使用shouldReceive 方法,來模擬調(diào)用Event 類,它將會(huì)返回一個(gè)Mockery mock 對(duì)象實(shí)例。

模擬 Facade

public function testGetIndex()
{
    Event::shouldReceive('fire')->once()->with('foo', ['name' => 'Dayle']);

    $this->call('GET', '/');
}

注意: 你不應(yīng)該模擬Request facade。取而代之,當(dāng)執(zhí)行你的測(cè)試,傳遞想要的輸入數(shù)據(jù)進(jìn)去call 方法。

框架 Assertions

Laravel 附帶幾個(gè)assert 方法,讓測(cè)試更簡單一點(diǎn):

Assert 響應(yīng)為 OK

public function testMethod()
{
    $this->call('GET', '/');

    $this->assertResponseOk();
}

Assert 響應(yīng)的狀態(tài)碼

$this->assertResponseStatus(403);

Assert 響應(yīng)為重定向

$this->assertRedirectedTo('foo');

$this->assertRedirectedToRoute('route.name');

$this->assertRedirectedToAction('Controller@method');

Assert 響應(yīng)的視圖包含一些數(shù)據(jù)

public function testMethod()
{
    $this->call('GET', '/');

    $this->assertViewHas('name');
    $this->assertViewHas('age', $value);
}

Assert Session 包含一些數(shù)據(jù)

public function testMethod()
{
    $this->call('GET', '/');

    $this->assertSessionHas('name');
    $this->assertSessionHas('age', $value);
}

Assert Session 有錯(cuò)誤信息

public function testMethod()
{
    $this->call('GET', '/');

    $this->assertSessionHasErrors();

    // Asserting the session has errors for a given key...
    $this->assertSessionHasErrors('name');

    // Asserting the session has errors for several keys...
    $this->assertSessionHasErrors(array('name', 'age'));
}

Assert 舊輸入內(nèi)容有一些數(shù)據(jù)

public function testMethod()
{
    $this->call('GET', '/');

    $this->assertHasOldInput();
}

輔助方法

TestCase 類包含幾個(gè)輔助方法讓應(yīng)用程序的測(cè)試更為簡單。

從測(cè)試?yán)锱渲煤退⑿?Sessions

$this->session(['foo' => 'bar']);

$this->flushSession();

配置目前為通過身份驗(yàn)證的用戶

你可以使用be 方法配置目前為通過身份驗(yàn)證的用戶:

$user = new User(array('name' => 'John'));

$this->be($user);

你可以從測(cè)試中使用seed 方法重新填充你的數(shù)據(jù)庫:

在測(cè)試中重新填充數(shù)據(jù)庫

$this->seed();

$this->seed($connection);

更多建立填充數(shù)據(jù)的信息可以在文檔的遷移與數(shù)據(jù)填充 部分找到。

重置應(yīng)用程序

你可能已經(jīng)知道,你可以通過$this->app 在任何測(cè)試方法中訪問你的應(yīng)用程序服務(wù)容器。這個(gè)服務(wù)容器會(huì)在每個(gè)測(cè)試類被重置。如果你希望在給定的方法手動(dòng)強(qiáng)制重置應(yīng)用程序,你可以從你的測(cè)試方法使用refreshApplication 方法。這將會(huì)重置任何額外的綁定,例如那些從測(cè)試案例執(zhí)行開始被放到 IoC 容器的 mocks。

上一篇:介紹下一篇:Laravel 安裝指南