# Bootstrapping your TestCase

As noted in the Login example, all MVC test cases should extend `Zend_Test_PHPUnit_ControllerTestCase`. This class in turn extends `PHPUnit_Framework_TestCase`, and gives you all the structure and assertions you'd expect from PHPUnit -- as well as some scaffolding and assertions specific to Zend Framework's MVC implementation.

In order to test your MVC application, you will need to bootstrap it. There are several ways to do this, all of which hinge on the public `$bootstrap` property.

First, you can set this property to point to a file. If you do this, the file should not dispatch the front controller, but merely setup the front controller and any application specific needs.

    class UserControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
    {
        public $bootstrap = '/path/to/bootstrap/file.php'

        // ...
    }

Second, you can provide a PHP callback to execute in order to bootstrap your application. This method is seen in the Login example. If the callback is a function or static method, this could be set at the class level:

    class UserControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
    {
        public $bootstrap = array('App', 'bootstrap');

        // ...
    }

In cases where an object instance is necessary, we recommend performing this in your `setUp()` method:

    class UserControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
    {
        public function setUp()
        {
            // Use the 'start' method of a Bootstrap object instance:
            $bootstrap = new Bootstrap('test');
            $this->bootstrap = array($bootstrap, 'start');
            parent::setUp();
        }
    }

Note the call to `parent::setUp()`; this is necessary, as the `setUp()` method of `Zend_Test_PHPUnit_Controller_TestCase` will perform the remainder of the bootstrapping process (which includes calling the callback).

During normal operation, the `setUp()` method will bootstrap the application. This process first will include cleaning up the environment to a clean request state, resetting any plugins and helpers, resetting the front controller instance, and creating new request and response objects. Once this is done, it will then either `include` the file specified in `$bootstrap`, or call the callback specified.

Bootstrapping should be as close as possible to how the application will be bootstrapped. However, there are several caveats:

- Do not provide alternate implementations of the Request and Response objects; they will not be used. `Zend_Test_PHPUnit_Controller_TestCase` uses custom request and response objects, `Zend_Controller_Request_HttpTestCase` and `Zend_Controller_Response_HttpTestCase`, respectively. These objects provide methods for setting up the request environment in targeted ways, and pulling response artifacts in specific ways.

- Do not expect to test server specifics. In other words, the tests are not a guarantee that the code will run on a specific server configuration, but merely that the application should run as expected should the router be able to route the given request. To this end, do not set server-specific headers in the request object.

Once the application is bootstrapped, you can then start creating your tests.