2015-06-05 9 views
7

Ich benutze Monolog in Symfony2 und benutze das Standard MonologBundle. Ich versuche in meinen Tests zu behaupten, dass eine Zeile protokolliert wird. Ich habe das so konfiguriert in meinem config_test.yml:Wie man eine Linie behauptet, wird mit Monolog in Symfony2 geloggt.

monolog: 
    handlers: 
     main: 
      type: test 
      level: debug 

Wie komme ich zu den Ergebnissen der Monolog des TestHandler in meinen Tests (die von Symfony2 des erben WebTestCase)?

Antwort

5

Als Lösung:

alle Handler von monolog Service Get und Test-Handler suchen.

foreach ($this->container->get('monolog')->getHandlers() as $handler) { 
    if ($handler instanceof TestHandler) { 
    $testHandler = $handler; 
    break; 
    } 
} 

if (!$testHandler) { 
    throw new \RuntimeException('Oops, not exist "test" handler in monolog.'); 
} 

$this->assertFalse($testHandler->hasCritical()); // Or another assertions 
0

In Ihrer Befehlsklasse, müssen Sie einfach die Handler-Set mit pushHandler():

namespace AppBundle\Command; 

use Symfony\Bridge\Monolog\Handler\ConsoleHandler; 
use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand; 
use Symfony\Component\Console\Input\InputInterface; 
use Symfony\Component\Console\Output\OutputInterface; 

class YourCommand extends ContainerAwareCommand 
{ 
    // ... 

    protected function execute(InputInterface $input, OutputInterface $output) 
    { 
     $logger = $this->getContainer()->get('logger'); 

     // PUSH THE OutputInterface OBJECT INTO MONOLOG 
     $logger->pushHandler(new ConsoleHandler($output)); 

     // Your command logic here... 
    } 

In Ihrem Test, mit CommandTester:

namespace AppBundle\Tests\Command; 

use AppBundle\Command\YourCommand; 
use Symfony\Bundle\FrameworkBundle\Console\Application; 
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; 
use Symfony\Component\Console\Output\OutputInterface; 
use Symfony\Component\Console\Tester\CommandTester; 

class YourCommandTest extends KernelTestCase 
{ 
    public function testExecute() 
    { 
     $kernel = $this->createKernel(); 
     $kernel->boot(); 

     // mock the Kernel or create one depending on your needs 
     $application = new Application($kernel); 
     $application->add(new YourCommand()); 

     $command = $application->find('acme:your:command'); 

     $commandTester = new CommandTester($command); 
     $commandTester->execute(
      array('command' => $command->getName()), 
      /** 
      * Here set the verbosity 
      */ 
      array('verbosity' => OutputInterface::VERBOSITY_DEBUG) 
     ); 

     // die(print_r($commandTester->getDisplay())); 

     $this->assertRegExp('/.../', $commandTester->getDisplay()); 
    } 
} 

Aufmerksamkeit auf array('verbosity' => OutputInterface::VERBOSITY_DEBUG) halten.

Auf diese Weise werden Sie alle Protokolle (a INFO in diesem Fall stellen Sie mit $logger->info('Starting <info>acme:your:command</info>');) erhalten:

[2015-08-13 23:39:22] app.INFO: Starting acme:your:command: 

Jetzt können Sie $this->assertRegExp() verwenden um zu überprüfen, ob eine bestimmte Zeile angemeldet ist oder nicht.

Sie können auch die string in einem array mit

explode('\n', $commandTester->getDisplay()) 

Diese Lösung found here waren transformieren und in der Dokumentation von Monolog here erläutert.

Mehr über Monolog and Symfony (Symfony Docu).

Mehr über Monolog Handlers (Monolog Docu).

+0

Ich habe nicht versucht, Protokollzeilen in einem Befehl zu bestätigen. Eine allgemeinere Gesamtlösung wäre wünschenswert. – hvtilborg

+0

Ich denke, ich verstehe nicht, was Sie erreichen möchten ... Können Sie Ihre Frage mit einigen weiteren Details aktualisieren? Schreiben Sie den Code des Tests, damit wir sehen können, wie Sie ihn implementiert haben und Ihnen eine Lösung bieten. – Aerendir