Enter SfCcTesting: Symfony 1.X Client-Crawler Testing

Earlier today I introduced why and how we initially integrated the Symfony2 testing mechanism into symfony 1.X : in order to make this piece of software as clean and evolvable as possible I just isolated it and made a small repo on Github.

SfCcTesting

SfCcTestingSymfony 1.X Client-Crawler Testing – is a small library (2 classes and a configuration file) which lets you write functional tests, in symfony 1.X, a là Symfony2.

if you take a look at the repository’s README you will find the basic instructions to start writing your tests: keep in mind that – although it’s usable on old-school symfony projects (svn etc) – you should install it with Git and manage dependencies and updates with Composer.

A PHPUnit functional test for symfony 1.X written thanks to SfCcTesting
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php

use odino\SfCcTesting\WebTestCase;

class HomepageTest extends WebTestCase
{
  public function testHelloWorld()
  {
    $client = $this->createClient();
    $crawler = $client->get('/');

    $this->assertEquals("Hello world", $crawler->filter('h1')->text());
  }

  protected function getApplication()
  {
    return 'frontend';
  }

  protected function bootstrapSymfony($app)
  {
    include(dirname(__FILE__).'/../../test/bootstrap/functional.php');
  }
}

Each test needs to implement 2 protected methods, getApplication() and bootstrapSymfony().

The getApplication method defines the application to bootstrap symfony for, and should be defined in an ApplicationWebTestCase class, like in the following example:

A base class for testing the backend
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php

use odino\SfCcTesting\WebTestCase;

class BackendWebTestCase extends WebTestCase
{
  protected function getApplication()
  {
    return 'backend';
  }

  protected function bootstrapSymfony($app)
  {
    include(dirname(__FILE__).'/../../test/bootstrap/functional.php');
  }
}

so your test files become leaner:

1
2
3
4
5
6
7
8
9
10
11
12
<?php

class HomepageTest extends BackendWebTestCase
{
  public function testHelloWorld()
  {
    $client = $this->createClient();
    $crawler = $client->get('/');

    $this->assertEquals("Hello world", $crawler->filter('h1')->text());
  }
}

The bootstrapSymfony() method, instead, includes the bootstrap for the symfony application in the test environment; you are allowed to redefine the location of the bootstrap in order not to force you to follow a unique directory structure convention.

The bootstrapSymfony() method should be placed in a BaseWebTestCase of our test suite:

A base class for boostrapping the symfony testing environment
1
2
3
4
5
6
7
8
9
10
11
<?php

use odino\SfCcTesting\WebTestCase;

class BaseWebTestCase extends WebTestCase
{
  protected function bootstrapSymfony($app)
  {
    include(dirname(__FILE__).'/../../test/bootstrap/functional.php');
  }
}

so your different ApplicationWebTestCase can share the same bootstrap file:

1
2
3
4
5
6
7
8
9
10
11
<?php

use odino\SfCcTesting\WebTestCase;

class BackendWebTestCase extends BaseWebTestCase
{
  protected function getApplication()
  {
    return 'backend';
  }
}
1
2
3
4
5
6
7
8
9
10
11
<?php

use odino\SfCcTesting\WebTestCase;

class FrontendWebTestCase extends BaseWebTestCase
{
  protected function getApplication()
  {
    return 'frontend';
  }
}

That’s all folks: with just a bunch of lines of code you are able to functionally test a symfony 1.X application with the Symfony2 DomCrawler.

Feel free to rant and, if you want, you can already rely on this small library via Packagist.

comments powered by Disqus