如何创建功能测试,其中包含对带参数的页面的POST?

时间:2011-12-09 00:51:12

标签: symfony phpunit functional-testing

我已经阅读了Symfony2的文档,但似乎没有用。这是我的功能测试:

public function testSearch()
{
    $client = static::createClient();
    $crawler = $client->request('POST', '/search/results', array('term' => 'Carteron'));
    $this->assertTrue($crawler->filter('html:contains("Carteron")')->count() > 0);
    $this->assertTrue($crawler->filter('html:contains("Auctions")')->count() > 0);
}

在我的控制器中,当该请求进入时,“term”参数为null。但是,当我在网站上执行搜索时,搜索工作正常,所以我知道设置测试时存在问题。

3 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,$request->query$request->request都没有。两者都对我做了同样的事情:它返回$default,而不是给定的$parameters(Symfony 2.3)。

与chris相同的行为,在普通的Web浏览器中它可以工作。我通过替换:

来解决这个问题
public function searchResultsAction($name)
{
    $request = Request::createFromGlobals();
    $term = trim($request->request->get('term'));
    return $this->searchResultsWithTermAction($term);
}

使用:

public function searchResultsAction(Request $request, $name)
{
    // do NOT overwrite $request, we got it as parameter
    //$request = Request::createFromGlobals();
    $term = trim($request->request->get('term'));
    return $this->searchResultsWithTermAction($term);
}

所以createFromGlobals()仅在$_GET$_POST设置时才有效。如果您使用symfony测试客户端,则不是Shich。您必须将$request参数添加到操作中。

(我在路由中使用了$name作为GET参数)

答案 1 :(得分:0)

我从来没有得到过这方面的答案,但已经实施了一个似乎适用于我的测试目的的解决方案。我很乐意听到反馈或得到这些问题的真实答案。

我所做的是为测试目的创建第二条路线。

在实际使用中,uri将为/search/results?term=searchtermhere

出于测试目的,这不起作用。通过自动化测试调用时,我永远无法访问术语值。 所以我所做的就是创建第二条路线,仅用于测试,其中包含/search/results/{searchtermhere}的uri。

然后我用于真实搜索的动作类将调用另一个函数并将该术语传递给函数:

public function searchResultsAction()
{
    $request = Request::createFromGlobals();
    $term = trim($request->request->get('term'));
    return $this->searchResultsWithTermAction($term);
}

所以我的功能测试会超过searchResultsWithTermAction(),所以我在这个解决方法中缺少的唯一代码覆盖是从请求中提取术语。

答案 2 :(得分:0)

我不知道是否还有人在寻找答案,但基本上问题是你在寻找参数的错误位置。

对于您的示例,您需要:

$term = trim($request->query->get('term'));

希望这有帮助!