一個請求發送出去之后,我們可以對HTTP的狀態碼做出斷言,在TP單元測試擴展中對狀態碼做出響應主要有兩個方法:
1. assertResponseOk:無參數,單元狀態碼為200
2. assertResponseStatus:接受一個狀態碼作為參數,并對這個狀態碼直接斷言
# assertResponseOk
在快速入門的編寫一個簡單的測試用例中,我們只有兩個測試類,一個是我們編寫的,一個是安裝擴展的時候自帶的。只有兩個測試類并且各自只有一個測試方法,理論上只有兩個斷言,但是卻有兩個測試類,四個斷言。這是因為在單元測試擴展中,當我們構建一個請求的時候,擴展會使用本方法進行斷言。
# assertResponseStatus
接受一個參數,該參數是要斷言的狀態碼。
assertResponseOk內部便是使用該方法進行斷言的。
# 例子
注意如果要使用redirect的話,就需要讓控制器繼承think\Controller。
~~~
<?php
namespace app\index\controller;
use think\Controller;
class Index extends Controller
{
public function index(){
return 'test';
}
public function index2(){
$this->redirect('http://www.baidu.com',302);
}
}
~~~
針對上面的控制器進行測試:
~~~
<?php
namespace tests;
//針對Index控制器
class IndexTest extends TestCase
{
public function testOutput(){
$this->visit('/index/index/index')->assertResponseOk();
}
public function testNo(){
$this->visit('/index/index/index2')->assertResponseStatus(200);
}
}
~~~
>注意,這里的testNo應該是斷言200的。在TP擴展中,assertResponseStatus目前階段基本沒有什么用處。因為當發生302的時候,擴展框架會重新就轉移地址重新發起一個請求。因此上文中的轉移到百度的頁面,實際上還是會被重新轉發到TP的App::run中,因此返回的結果會是test。例子如下:
~~~
public function testNo(){
$response=$this->visit('/index/index/index2');
$response->assertResponseStatus(200);//不是302
$response->see('test');//OK
}
~~~
# 對異常斷言
當程序使用AOP來實現權限認證的時候,有可能當用戶沒有登錄的時候,會返回401錯誤。但是在TP測試框架中,非200的狀態碼都會拋出一個異常,因此我們可以通過斷言異常來判斷權限認證:
```
/**
* @expectedException think\testing\HttpException
*/
public function testDeleteUser_noLogin(){
$this->visit('/admin/test/test');//由于用戶沒有登錄,會返回401,而TP測試框架會拋出異常
}
```