Bug with PHPUnit_Extensions_SeleniumTestCase

by Developer @ pebbl.co.uk on Wednesday, 26 September 2012

Over the last few years I've been constantly surrounded by chatter with regard to Selenium, but had never been in a position to try it out. Yesterday that changed when Tate stated the need to have as near to continous integration as possible with the on-going enhancements to their core website.

So, this has led to lots of interesting learning and reading up on something that has - until now - only really been a buzzword for me :)

Unfortunately my first foray into this area led me straight to a rather annoying bug in a particular PHPUnit extension designed to integrate a PHP script with Selenium. Basically I set about doing what most coders would do when presented with an Object Orientated architecture, I attempted to extend PHPUnit_Extensions_SeleniumTestCase with my own functionality.

Initially everything seemed to work as expected... that is until one of my Selenium tests generated an error. Rather than a helpful error message, my script bugged out with the following unhelpful error:


Argument 5 passed to PHPUnit_Framework_Error::__construct() 
must be an instance of Exception, array given

On a closer look into the problem it seems that PHPUnit_Framework_Error.php has been upgraded, however the code in PHPUnit_Extensions_SeleniumTestCase.php hasn't.


class PHPUnit_Framework_Error extends Exception
{
    /**
     * Constructor.
     *
     * @param  string     $message
     * @param  integer    $code
     * @param  string     $file
     * @param  integer    $line
     * @param  Exception  $previous
     */
    public function __construct($message, 
                                $code, 
                                $file, 
                                $line, 
                                Exception $previous = NULL)
    {
        parent::__construct($message, $code, $previous);

        $this->file  = $file;
        $this->line  = $line;
    }
}

The fifth argument has been changed to expect an Exception object, whereas, whenever a new PHPUnit_Framework_Error is called into existence from PHPUnit_SeleniumTestCase.php, you get:


throw new PHPUnit_Framework_Error($buffer, 
                                  $e->getCode(), 
                                  $e->getFile(), 
                                  $e->getLine(), 
                                  $e->getTrace());

The last parameter is incorrect, it should be:


throw new PHPUnit_Framework_Error($buffer, 
                                  $e->getCode(), 
                                  $e->getFile(), 
                                  $e->getLine(), 
                                  $e);

Or at least changing it to the above fixes the issues I was experiencing, now my code warns about errors correctly. Just in case it's useful to anyone out there :)

Leave your comment