牛骨文教育服务平台(让学习变的简单)

说明

在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 appindexcontroller;
use thinkRequest;
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一致的功能。