PhalconPHP的MVC微型应用程序。指定一个请求路径并断定响应代码[英] PhalconPHP MVC Micro app: Specify a request path and assert the response code

问题描述

我已遵循 单元测试教程并修改它以测试对 Micro MVC 应用程序的 HTTP 请求,基于 在这篇文章中.我可以成功验证输出字符串,但是我不确定如何断言响应状态代码或更改请求路径.

index.php

<?php

$app = new \Phalcon\Mvc\Micro();

#Default handler for 404
$app->notFound(function () use ($app) {
    $app->response->setStatusCode(404, "Not Found")->sendHeaders();
});

$app->post('/api/robots', function() use ($app) {
    //Parse JSON as an object
    $robot = $app->request->getJsonRawBody();
    //Build the response
    $app->response->setJsonContent($robot);
    return $app->response;
});

$app->get('/', function() {
    echo 'Hello';
});

$app->handle();

测试/UnitTest.php

class MvcMicroUnitTest extends \UnitTestCase {

    public function testNotFound() {
        $path = '/invalid';
        $mockRequest = $this->getMock("\\Phalcon\\Http\\Request");
        //TODO: Set an invalid URL $path in the mock
        $this->di->set('request', $mockRequest, true);
        include("../index.php");
        //TODO: Assert status is 404
        $this->expectOutputString('');
    }

    public function testPostRobot() {
        $rawJson = '{"name":"C-3PO","type":"droid","year":1977}';
        $path = '/api/robots';
        $mockRequest = $this->getMock("\\Phalcon\\Http\\Request", array(
            "getJsonRawBody"));
        $mockRequest->expects($this->any())
                ->method("getRawBody")
                ->will($this->returnValue($rawJson));
        //TODO: Set the $path in the mock
        $this->di->set('request', $mockRequest, true);
        include("../index.php");
        //TODO: Assert status is 200
        $this->expectOutputString($rawJson);
    }
}

推荐答案

好消息和坏消息.好:只要您使用标准调度原则,您就会得到一个响应,其中包含您需要的信息.小技巧 - 当状态为成功时,标头设置为 false.

/**
 * @param $expected
 * @throws ExpectationFailedException
 * @return $this
 */
protected function assertResponseCode($expected)
{
    $actual = $this->di->getResponse()->getHeaders()->get('Status');

    if ($actual !== false && $expected !== 200 && !preg_match(sprintf('/^%s/', $expected), $actual)) {
        throw new ExpectationFailedException(sprintf('Failed asserting that response code is "%s".', $expected));
    }

    $this->assertTrue(true);
    return $this;
}

不好:你做错了.这是功能/验收测试领域,有一个很棒的框架叫做 Behat.您应该进行自己的研究,但本质上,虽然 PHPUnit 擅长测试或多或少独立的功能块,但它在测试更大的事情(如完整的请求执行)方面很糟糕.稍后您将开始遇到会话错误、错误配置的环境等问题,所有这些都是因为每个请求都应该在其自己的单独空间中执行,而您强制它执行相反的操作.另一方面,Behat 以一种非常不同的方式工作,对于每个场景(发布机器人,查看不存在的页面),它都会向服务器发送一个新请求并检查结果.它主要用于通过对最终结果(响应对象/html/json)进行断言来对所有协同工作的事物进行最终测试.

本文地址:https://www.itbaoku.cn/post/1739749.html