【问题标题】:Controller unit test in slim3slim3 中的控制器单元测试
【发布时间】:2016-07-06 14:16:51
【问题描述】:

首先,我想说 - 我是 PHP (phpunit) 单元测试的新手。 在我的新项目(slim3 框架)中,我想测试我的控制器,例如 LoginController。

我的想法是(在单元测试方法中)

  • 创建LoginController 的实例
  • 在控制器 (DI) 中模拟一些服务
  • 执行请求响应的方法(在我的控制器方法__invoke

我的问题是关于__invoke 方法的参数。 在 Slim3 中,请求的可调用方法有两个第一个参数:

RequestInterface $requestResponseInterface $response

如何在我的单元测试类中创建这些参数?我正在寻找有关此问题的一些示例,但没有成功。

有什么建议吗?

我在 Slim3 测试中找到了一些模拟请求的代码:

protected function requestFactory()
{
    $uri = Uri::createFromString('https://example.com:443/foo/bar?abc=123');
    $headers = new Headers();
    $cookies = array(
        'user' => 'john',
        'id' => '123',
    );
    $env = Slim\Http\Environment::mock();
    $serverParams = $env->all();
    $body = new Body(fopen('php://temp', 'r+'));
    $request = new Request('GET', $uri, $headers, $cookies, $serverParams, $body);

    return $request;
}

但我不确定这是个好方法。

感谢您的帮助

【问题讨论】:

    标签: phpunit slim slim-3


    【解决方案1】:

    我在这里写了一个解决方案:https://akrabat.com/testing-slim-framework-actions/

    我使用Environment::mock() 创建$request,然后我可以运行该操作。让每条路由都可以调用一个类,其中所有依赖项都注入到构造函数中,这也使得这一切变得更加容易。

    基本上,测试如下所示:

    class EchoActionTest extends \PHPUnit_Framework_TestCase
    {
        public function testGetRequestReturnsEcho()
        {
            // instantiate action
            $action = new \App\Action\EchoAction();
    
            // We need a request and response object to invoke the action
            $environment = \Slim\Http\Environment::mock([
                'REQUEST_METHOD' => 'GET',
                'REQUEST_URI' => '/echo',
                'QUERY_STRING'=>'foo=bar']
            );
            $request = \Slim\Http\Request::createFromEnvironment($environment);
            $response = new \Slim\Http\Response();
    
            // run the controller action and test it
            $response = $action($request, $response, []);
            $this->assertSame((string)$response->getBody(), '{"foo":"bar"}');
        }
    }
    

    【讨论】:

    • 这对我很有用!谢谢@rob(您网站上的解决方案也很有帮助)
    • 感谢此代码,@rob-allen!如果我们的路由是通过匿名函数定义的,你会如何建议我们做类似的事情? (例如:$app->get("/test/{id}", function($request, $response, $args) { ... });
    • 我想通了。对于那些好奇的人,你需要将你的匿名函数变成一个命名函数(例如echo_action())。然后,不要使用$action = new \App\Action\EchoAction();,而是使用$action = "echo_action";
    • 感谢@ringo 的注释。测试匿名函数是困难
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-12
    • 2017-06-26
    • 2011-12-01
    • 2014-01-16
    • 1970-01-01
    相关资源
    最近更新 更多