- 代码需要做
HTTP
测试,Laravel
中有自带这方面的功能。现在使用slim
就得自己动手丰衣足食。 - 网上找了许多例子,关于这方便的比较少。然后就想到了查看
Laravel
的源码 - 看了一下,发现其实是自己伪造一个
Request
对象,然后执行返回结果 - 然后自己也参考这个在
slim
中实现
构建好测试文件
composer.json
加入以下内容自动加载,并执行composer dump-auto
代码语言:javascript
复制 "autoload-dev": {
"psr-4": {
"Tests\": "tests/"
}
}
代码语言:javascript
复制<phpunit bootstrap="tests/bootstrap.php">
<testsuites>
<testsuite name="Feature">
<directory suffix="Test.php">tests</directory>
</testsuite>
</testsuites>
</phpunit>
tests/bootstrap.php
文件内容如下
代码语言:javascript
复制<?php
use PsrHttpMessageResponseInterface as Response;
use PsrHttpMessageServerRequestInterface as Request;
use SlimFactoryAppFactory;
require __DIR__ . '/../vendor/autoload.php';
$app = AppFactory::create();
$app->get('/hello/{name}', function (Request $request, Response $response, array $args) {
$name = $args['name'];
$response->getBody()->write("Hello, $name");
return $response;
});
$app->get('/api/v1/users', function (Request $request, Response $response) {
$data = [['name' => 'Bob', 'age' => 40]];
$payload = json_encode($data);
$response->getBody()->write($payload);
return $response
->withHeader('Content-Type', 'application/json');
});
// 这里不要运行 app
// $app->run();
// 并且声明一个函数得到 App 对象
function getApplication()
{
global $app;
return $app;
}
- 创建测试文件
tests/HomeTest.php
写入一下内容
代码语言:javascript
复制<?php
namespace Tests;
use NyholmPsr7Uri;
use PHPUnitFrameworkTestCase;
use SlimFactoryServerRequestCreatorFactory;
class HomeTest extends TestCase
{
public function testHello()
{
$name = 'Bob';
$serverRequestCreator = ServerRequestCreatorFactory::create();
$request = $serverRequestCreator->createServerRequestFromGlobals();
$uri = new Uri();
$request = $request->withUri($uri->withPath("/hello/{$name}"));
$response = getApplication()->handle($request);
$responseContent = (string)$response->getBody();
$this->assertEquals($responseContent, "Hello, {$name}");
}
public function testJsonApi()
{
$serverRequestCreator = ServerRequestCreatorFactory::create();
$request = $serverRequestCreator->createServerRequestFromGlobals();
// 因为 Uri 和 Request 对象都是不可以修改的,所以都需要新建
$uri = new Uri();
$request = $request->withUri($uri->withPath('api/v1/users'));
// 如果需要伪造查询参数可以这样子做
// $request = $request->withQueryParams([]);
// 使用全局函数拿到 App, 传入伪造的 Request,得到处理之后的 Response
$response = getApplication()->handle($request);
// 需要用 (string) 强转,不要直接 $response->getBody()->getContents()
// 区别就是强转,在实现类把读取指针重置到了第一位,防止得不到完整的内容
$responseContent = (string)$response->getBody();
$this->assertJson($responseContent);
}
}
代码语言:javascript
复制$ phpunit
PHPUnit 7.5.17 by Sebastian Bergmann and contributors.
.. 2 / 2 (100%)
Time: 45 ms, Memory: 4.00 MB
OK (2 tests, 2 assertions)