# 说明
在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一致的功能。