提问者:小点点

SimpleFormatter的单元测试


我需要为我的工作写一个Unittest,但我以前没有任何PHP知识。

Unittest给了我一个错误,我的参数with::format需要是其他相关过滤器的实例。问题是我不允许更改任何过滤器,我只需要编写Unittest。

所以我的问题是,还有其他解决办法吗?

如果有人想帮助我,我将非常感激

<?php

    declare(strict_types=1);
    namespace Horde\Log\Formatter;
    use Horde\Log\LogFormatter;
    use Horde\Log\LogMessage;
    use InvalidArgumentException;


    class SimpleFormatter implements LogFormatter

    { 
    
    protected $format;

    
    public function __construct($options = null)
    {
        $format = (is_array($options) && isset($options['format']))
            ? $options['format']
            : $options;

        if (is_null($format)) {
            $format = '%timestamp% %levelName%: %message%' . PHP_EOL;
        }

        if (!is_string($format)) {
            throw new InvalidArgumentException('Format must be a string');
        }

        $this->format = $format;
    }

   
    public function format(LogMessage $event): string
    {
        $output = $this->format;
        $context = $event->context();
        $context['message'] = $event->formattedMessage();
        foreach ($context as $name => $value) {
            $output = str_replace("%$name%", $value, $output);
        }
        return $output;
    }
}

    <?php

    namespace Horde\Log\Test\Formatter;
    use PHPUnit\Framework\Testcase;
    use Horde\Log\Formatter\SimpleFormatter;
    use Horde\Log\LogMessage;
    use Horde\Log\LogFormatter;



    class SimpleFormatterTest extends TestCase
    {
    public function testConstructorThrowsOnBadFormatString()
    {
        $this->expectException('InvalidArgumentException');    
        new SimpleFormatter(1);
    }

    public function testDefaultFormat()
    {
        $f = new SimpleFormatter();
        $line = $f->format(array('message' => $message = 'message', 
                                'level' => $level = SimpleFormatterTest::ALERT,
                                'levelName' => $levelName = 'ALERT'));
        
        $this->assertStringContainsString($message, $line);
        $this->assertStringContainsString($levelName, $line);
    } 
}

共1个答案

匿名用户

您不应该将数组传递到格式化方法。格式化方法需要一类类型为logmail的

    $f = new SimpleFormatter();
    $message = new LogMessage(..some parameters);
    $line = $f->format( $message );
    
    $this->assertStringContainsString($message, $line);
    $this->assertStringContainsString($levelName, $line);

像这样的东西。它与单元测试无关。这是基本的编程原则.你可以把任何东西都放到一个方法中