V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
DavidNineRoc
V2EX  ›  分享发现

在 [slim] 中伪造 Request 来进行你的 HTTP 测试吧

  •  
  •   DavidNineRoc · 2019-12-04 17:26:19 +08:00 · 1866 次点击
    这是一个创建于 1598 天前的主题,其中的信息可能已经有所发展或是发生改变。
    • 代码需要做HTTP测试,Laravel中有自带这方面的功能。现在使用slim就得自己动手丰衣足食。
    • 网上找了许多例子,关于这方便的比较少。然后就想到了查看Laravel的源码
    • 看了一下,发现其实是自己伪造一个Request对象,然后执行返回结果
    • 然后自己也参考这个在slim中实现

    构建好测试文件

    • composer.json加入以下内容自动加载,并执行composer dump-auto
        "autoload-dev": {
            "psr-4": {
                "Tests\\": "tests/"
            }
        }
    ```	
    * 根目录新建配置文件`phpunit.xml`内容如下
    
    
    <phpunit bootstrap="tests/bootstrap.php"> <testsuites> <testsuite name="Feature"> <directory suffix="Test.php">tests</directory> </testsuite> </testsuites> </phpunit> ``` * `tests/bootstrap.php`文件内容如下
    <?php
    use Psr\Http\Message\ResponseInterface as Response;
    use Psr\Http\Message\ServerRequestInterface as Request;
    use Slim\Factory\AppFactory;
    
    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写入一下内容
    <?php
    
    namespace Tests;
    use Nyholm\Psr7\Uri;
    use PHPUnit\Framework\TestCase;
    use Slim\Factory\ServerRequestCreatorFactory;
    
    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);
        }
    }
    
    • 最后的最后,执行phpunit得到测试结果
    $ 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)
    

    原文链接 http://www.shiguopeng.cn/archives/431

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2746 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 13:00 · PVG 21:00 · LAX 06:00 · JFK 09:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.