測(cè)試

2018-12-17 10:56 更新

介紹

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

tests 文件夾有提供一個(gè)測(cè)試?yán)?。在安裝新 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', ['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è)試更簡(jiǎn)單一點(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(['name', 'age']);}

           

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

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

    $this->assertHasOldInput();}

           

           

輔助方法

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

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

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

           

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

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

$user = new User(['name' => 'John']);$this->be($user);

           

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

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

$this->seed();$this->seed('DatabaseSeeder');

           

更多建立填充數(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。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)