当WebTestCase用于功能测试捆绑包时指定配置?

时间:2012-09-27 06:44:58

标签: testing symfony bundle functional-testing

我正在尝试做的是功能测试我的捆绑(可重复使用的捆绑)。更深入:

  • 创建对指定网址/my/url
  • 的请求
  • 检查是否已调用MyParamConverter并将请求转换为MyObject的实例
  • 检查控制器是否抛出my.event

根据文档,我应该扩展Symfony\Bundle\FrameworkBundle\Test\WebTestCase并创建一个新客户端:

    $client  = static::createClient();
    $crawler = $client->request('GET', '/my/url');

这样做,哪些捆绑包被加载?如何指定要在环境中使用的配置文件(假设它默认为test)?

编辑:好的,是时候更好地解释一下我的问题。 AcmeMessagingBundle说,我正在拧一个可重复使用的捆绑包。现在我想进行功能测试。场景是对/my/url的调用:

public function testReceiveApiRoute()
{
    $client = $this->createClient();

    /** @var $route \Symfony\Component\Routing\Route */
    $route  = $client->getContainer()->get('router')
        ->getRouteCollection()->get('acme_messaging_receive');

    $this->assertNotNull($route);
    $this->assertEquals('POST', $route->getRequirement('_method'));
    $this->assertEquals('acme_messaging.controller.api:receive',
        $route->getDefault('_controller'));
}

/**
 * @depends testReceiveApiRoute
 */
public funcion testReceiveApiWorkflow()
{
    $client = $this->createClient();

    // Make a POST request
    $request = Request::create('/my/route', 'POST', array(
        'a' => 'value'
    ));

    // Request is convered in MyObject instance and that my.event is fired
}

通过此测试,加载app/config_test.yml(例如“主配置文件”)。问题是:

不应该测试“隔离”,意味着不使用主配置文件?如果我的包被另一个空app/config_test.yml的人测试怎么办?测试会失败......

测试也会因前缀路径而失败。如果使用前缀导入AcmeMessagingBundle中的routing.xml,则testReceiveApiWorkflow将失败!

1 个答案:

答案 0 :(得分:3)

使用WebTestCase会将您自己的AppKernel用于测试环境。

您可以为您的应用添加新的环境,并在WebTestCase中使用它,如下所示:

$client = static::createClient(array('environment' => 'new_env'));

更安全的做法是在捆绑包的测试中创建一个应用程序。 您可以使用JMSCommandBundle为您生成它。 您还可以使用此技巧创建查看捆绑包的sanboxed应用程序:https://github.com/schmittjoh/JMSPaymentCoreBundle/tree/master/Tests/Functional