scruffycoder86
scruffycoder86

Reputation: 549

Undefined variable in PHPUnit Test Class

I have a test class that reports an undefined variable and I cannot seem to understand what the issue is.

Basically the listener below is suppose to listen to an application boot event documented in the class below:

<?php

 namespace Colleen\Core\Event\Application;

final class ApplicationBootedEvents
{
  const APP_BOOTED = 'application.booted';
 }

My event class is as shown below which receives an instance of the application itself.

<?php

 namespace Colleen\Core\Event\Application;

 use Symfony\Component\EventDispatcher\Event;
 use Colleen\Core\Application;

/**
 * The application.booted event is dispatched each time 
 * an application instance is created in the system.
 *
 */
class ApplicationBootedEvent extends Event
{
  protected $app;

  public function __construct(Application $app)
  {
     $this->app = $app;
   }

  public function getApplication()
  {
     return $app;
   }
}

These two classes to me look perfect according to Symfony's documentation on the Event Dispatcher Component. Following is the listener class that is suppose to listen to ApplicationBootedEvents::APP_BOOTED event.

<?php

 namespace Colleen\Core\Event\Application\Listener;

 use Colleen\Core\Event\Application\ApplicationBootedEvent;

 class ApplicationBootedListener
{
   public function onBoot(ApplicationBootedEvent $event)
   {
     $container = $event->getApplication()->getContainer();

     $container->set('class.dispatcher', '\\Symfony\\Component\\EventDispatcher\\EventDispatcher');
    }
 }

The Listener class does nothing at the moment and my test case is to test whether the "class.dispatcher" key exist on my container which simple extends Pimple and is made available through the Application Object.

Below is my test that shows how these will eventually be used in my front controller or any class that stands between them and the front controller.

<?php

 namespace Colleen\Qa\Core\Event\Application\Listener;

 use Colleen\Core\Event\Application\Listener\ApplicationBootedListener;
use Colleen\Core\Event\Application\ApplicationBootedEvents;
use Colleen\Core\Event\Application\ApplicationBootedEvent;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Colleen\Core\Container\Container;
use Colleen\Core\Application;

class AppliocationBootedListenerTest extends \PHPUnit_Framework_TestCase
{
  public function testApplicationBootListener()
  {
    $dispatcher = new EventDispatcher();

    $dispatcher->addListener(
      ApplicationBootedEvents::APP_BOOTED, array(
        new ApplicationBootedListener(), 'onBoot'
      ));

    $app = $dispatcher->dispatch(ApplicationBootedEvents::APP_BOOTED, new ApplicationBootedEvent(new Application(new Container())))->getApplication();

    $expected = '\\Symfony\\Component\\EventDispatcher\\EventDispatcher';
    $actual = $app->getContainer()->get('class.dispatcher');

    $this->assertSame($expected, $actual);
  }
}

The idea is to test whether the Listener gets called and if it is able to feed our application object's container with all the necesary objects we will need to get our web framework to work.

Below is the output I get as a result if running this test case.

enter image description here

Upvotes: 0

Views: 2004

Answers (1)

LMS94
LMS94

Reputation: 1036

There's an error in your ApplicationBootedEvent.php file, on line 24 as the stack trace suggested..

Change

public function getApplication()
{
    return $app;
}

To

public function getApplication()
{
    return $this->app;
}

Upvotes: 2

Related Questions