# 編寫一個操作
* * * * *
首次運行ThinkPHP之后,都會默認創建一個Index模塊,Index控制器和一個index的操作。
接下來的這個實例,我們就是要在Index控制器中添加一個test的操作,在這個操作中,我們輸出一段字符串:`hello world`。然后在測試用例中對這個字符串進行斷言。
1. 新建一個test的操作
首先在路徑tp5/application/index/controller/Index.php中新建一個test的操作:
~~~
<?php
namespace app\index\controller;
class Index
{
public function index()
{
...
}
public function test(){
return 'Hello world!';
}
}
~~~
上面這段代碼的主要功能就是輸出一段`Hello world!`的字符串。在瀏覽器中的路徑通常是:
`http://127.0.0.1/tp5/public/index.php/index/index/test`
結果是在網頁中顯示一段字符串Hello world!。注意,該路徑可能在不同配置下有所不同,請注意更改。
> 安全提示:官方建議的根目錄應該為public,在這里因為我本地測試項目比較多,因此本項目只是一個子項目,沒有設置public為根目錄。請不要在生產環境上使用類似上面的路徑。
>
> 并且因為測試框架是模擬請求,因此是不用搭建服務器的。
2. 新建一個測試用例類
在tests目錄下新建一個IndexTest.php的測試用例類,并在其中鍵入一下的代碼:
~~~
<?php
namespace tests;
class IndexTest extends TestCase
{
public function testTest()
{
$this->visit('/index/index/test')->see('Hello world!');
}
}
~~~
> 如果直接復制上面代碼,請注意縮進的問題和編碼問題。否則運行過程中可能會報錯。
該測試用例是繼承ThinkPHP單元測試擴展類TestCase的。該類提供了多個用于支持ThinkPHP進行單元測試的方法。
其中,visit方法是接受一個作為URI的參數模擬向ThinkPHP框架中的某個測試發起請求。
而see方法則是斷言輸出的結果是否符合一個正則表達式,其中第一個參數為要匹配的正則表達式,第二個參數的值為true時斷言正則表達式不出現在結果中,為false時斷言正則表達式出現在結果中,默認為false。
3. 運行測試
輸入一下命令,進行測試:
`php think unit`
這條命令需要在ThinkPHP根目錄下運行,在本文檔中是tp5目錄下運行。當在使用命令的時候,需要切換到該目錄中來。
think是在ThinkPHP目錄下的一個PHP文件,當運行這條命令的時候,實際上會執行think文件的。
這個時候運行結果會是:

在結果的最后一行中,顯示OK,說明所有的測試用例都測試通過了,在括號中的內容是表示有2個測試用例類,4個斷言被測試了。
> 這里之所以有`2 tests`是因為tests目錄下還有一個`ExampleTest.php`的測試類。
>
> 而`4 assertions`則表明是有四個測試用例。當我們把
>
> `$this->visit('/index/index/test')->see('Hello world!');`
>
> 修改成
>
> `$this->visit('/index/index/test');`
>
> 可以發現,現在的assertions只剩下三個了。因此,可以得知visit內部也有斷言。
>
> $this->assertEquals(200, $status);
>
> 主要是對網頁請求的狀態碼進行斷言。