控制器单元测试在slim3

时间:2016-03-19 22:17:38

标签: phpunit slim slim-3

首先,我想说 - 我是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;
}

但我不确定这是好方法。

感谢您的帮助

1 个答案:

答案 0 :(得分:16)

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

我使用for i in 1...100000 { //generate self.models.append(DBMSModel(time: self.generateTime(NSTimeInterval(i)), money: Float(i), payType: self.payType[i % 4], payPlace: self.place[i % 4]).contentData) endTime = NSDate().timeIntervalSince1970 if i > 100 { if i % (i / 100) == 0 { dispatch_async(dispatch_get_main_queue(), { () -> Void in self.mainTableView.reloadData() self.mainTableView.scrollToEndOfDocument(nil) }) } } } 创建Environment::mock()然后我可以运行该操作。使每个路由可调用一个类,其中所有依赖项都被注入到构造函数中,这使得这一切变得更加容易。

基本上,测试看起来像这样:

$request