ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
# 说明 在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一致的功能。