# 說明
在TP單元測試擴展中,模擬發送請求可以有5種方法,其中四種是擴展中自帶的,另外一種是由我們自己通過request構建一個請求。擴展中帶的四中分別是:
1. visit:發起一個GET的請求,只需要傳入URI即可
2. submitForm:
3. makeRequest:
4. makeRequestUsingForm:
# visit
visit方法只接受一個參數uri,在這個參數傳入我們的請求路徑,擴展便會幫助我們構建一個GET的請求。其在底層是使用方法makeRequest進行構建的。
例子:
`$this->visit('/index/index/index');`
# makeRequest
$method:傳輸的方法
$uri
$parameters = []:所帶參數
$cookies = []
$files = []
`$this->makeRequest('GET','/index/index/getMethod/name/c7')`
> 注意:請不要使用$parameters進行傳參和使用?key=value方式傳參,在目前的5.x中,這兩種方式都會出現問題。這是因為在CLI下,創建請求的時候$_GET不會被設置,而普通的URL方式在5.X版本又不支持,因此才會出現這個問題的。解決方法是在request::create中添加一行代碼:$_GET=$params;但是這個會修改到源代碼,因此還是希望大家暫停使用這兩種方法,等待官方的解決方案。
> 當使用$parameters進行傳參的時候,如果是使用官方封裝的request對象來獲得參數,程序能夠正常運行。但是切記不可使用$_GET等等超全局變量。
# submitForm
submitForm是基于makeRequest的,也就是說當使用makeRequest返回的內容中存在Form的話,我們就可以通過submitForm處理這個Form。
因此,我們需要構建兩個操作,一個用于返回一個含有form的頁面,一個用于接受這個form的請求。
index控制器如下:
~~~
<?php
namespace app\index\controller;
use think\Request;
class Index
{
public function index(){
return <<<html
<html>
<body>
<form method="get" action="testForm">
<input type="text" name='test' value="123">
<input type="submit" value="submit">
</form>
</body>
</html>
html;
}
public function testForm(){
return 'hello';
}
}
~~~
可以使用以下測試:
~~~
<?php
namespace tests;
//針對Index控制器
class IndexTest extends TestCase
{
public function testForm(){
$this->visit('index/index/index')->submitForm('submit',[
'test'=>'test'
])->see('hello');
}
}
~~~
首先是使用visit發起一個請求,返回一個帶有form的頁面。接著使用submitForm提交該form。
~~~
注意:這里依然是cli模式下,而通過submitForm依然會使用makeRequest的$parameters參數,因此也會造成在實際的控制器中無法得到具體的參數值。除非使用官方封裝的request對象。
~~~
submitForm接受三個值,從上面的例子中我們可以知道,第一個參數是form的提交按鈕的文本,第二個為提交的鍵值對,第三個為要上傳的文件。
# makeRequestUsingForm
submitForm是對makeRequestUsingForm的另外一層封裝。因此通常使用submitForm會比較方便。如果要使用makeRequestUsingForm的話,我們則需要傳入兩個參數,一個是Form類型的,一個是提交的文件。
其中Form我們可以自行構建,也可以通過getForm來實現跟submitForm一致的功能。