首先,我想说 - 我是 PHP (phpunit) 单元测试的新手。
在我的新项目(slim3 框架)中,我想测试我的控制器,例如 LoginController。
我的想法是(在单元测试方法中)
- 创建实例
LoginController
- 模拟控制器中的一些服务(DI)
- 执行方法是对请求的响应(在我的控制器方法中
__invoke
)
我的问题是关于参数__invoke
方法。
在 Slim3 中,请求的可调用方法有两个第一个参数:
RequestInterface $request
and ResponseInterface $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;
}
但我不确定这是个好方法。
谢谢你的帮助
我在这里写了一种解决方案:https://akrabat.com/testing-slim-framework-actions/ https://akrabat.com/testing-slim-framework-actions/
I use 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"}');
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)